zoukankan      html  css  js  c++  java
  • Web Service属性介绍

    每个 Web Service都需要唯一的命名空间,它可使客户端应用程序区分出可能使用相同方法名称的 Web Service。在 Visual Studio.NET中创建的Web Service的默认命名空间是“http://tempuri.org/”。尽管命名空间类似于典型的URL,但在Web浏览器中是不能查看的,它只是一个唯一标识符。

    Web Service(Web服务)提供以下属性。

    l         Description:此属性的值包含描述性消息,此消息将在XML Web Service的说明文件(例如服务说明和服务帮助页)生成后显示给XML Web Service的潜在用户。

    l         Name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XML Web Service的类的名称。

    l         Namespace:此属性的值包含 XML Web Service的默认命名空间。XML命名空间提供了一种在XML文档中创建名称的方法,该名称可由统一资源标识符(URI)标识。使用XML命名空间,可以唯一标识XML文档中的元素或属性。因而,在 XML Web Service的服务说明中,Namespace被用做与XML Web Service直接相关的 XML 元素的默认命名空间。如果不指定命名空间,则使用默认命名空间 http://tempuri.org/。

    以下示例代码说明了Web Service属性的用法:

    //<summary>

    //Service1 的摘要说明

    //</summary>

    [WebService(Namespace = "http://tempuri.org/",

        Description = "接口的描述说明文字-测试。",

        Name = "LTPService")] //Web Service 的名称

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [ToolboxItem(false)]

    public class Service1 : System.Web.Services.WebService

    {

    }

    WebMethod(Web服务方法)有以下6个属性。

    l         Description:是对Web Service方法的描述信息。就像Web Service方法的功能注释,可以让调用者看见的注释。

    [WebMethod(Description="根据产品编号查询产品的价格")]

    public string GetProductPrice2(string ProductId)

    {

        Products pro = new Products();

        return pro.GetPrice(ProductId);

    }

    l         EnableSession:指示Web Service是否启动Session标志,主要通过Cookie完成,默认为false。

    public static int i = 0;

    [WebMethod(EnableSession = true)]

    public int Count()

    {

        i = i + 1;

        return i;

    }

    在IE地址栏中输入:http://localhost/WebService1/Service1.asmx/Count?,刷新看看:

    <?xml version="1.0" encoding="utf-8" ?>

      <int xmlns="http://tempuri.org/">1</int>

    <?xml version="1.0" encoding="utf-8" ?>

       <int xmlns="http://tempuri.org/">2</int>

    //…不停地刷新,Session的值一直存在

    l         MessageName:主要实现方法重载后的重命名:

    public static int i = 0;

    [WebMethod(EnableSession = true)]

    public int Count()

    {

        i = i + 1;

        return i;

    }

    [WebMethod(EnableSession = true, MessageName = "Count1")]

    public int Count(int da)

    {

        i = i + da;

        return i;

    }

    通过count访问的是第1个方法,而通过count1访问的是第2个方法。

    l         TransactionOption:指示Web Service方法的事务支持。

    由于HTTP协议的无状态特性,Web Service方法只能作为根对象参与事务。如果COM对象与Web Service方法参与相同的事务,并且在组件服务管理工具中被标记为在事务内运行,则Web Service方法可以调用这些COM对象。如果一个TransactionOption属性为Required或RequiresNew的Web Service方法调用另一个TransactionOption属性为Required 或RequiresNew的Web Service方法,则每个 Web Service方法将参与它们自己的事务,因为Web Service方法只能用做事务中的根对象。如果异常是从Web服务方法引发的或未被该方法捕获,则自动放弃该事务。如果未发生异常,则自动提交该事务,除非该方法显式调用 SetAbort。

    ①Disabled

    指示Web Service方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行Web Service方法。

    [WebMethod(TransactionOption = TransactionOption.Disabled)]

    ②NotSupported

    指示Web Service方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行Web Service方法。

    [WebMethod(TransactionOption= TransactionOption.NotSupported)]

    ③Supported

    如果有事务,则指示Web Service方法在事务范围内运行。如果没有事务,则将在没有事务的情况下创建Web Service。

    [WebMethod(TransactionOption= TransactionOption.Supported)] 

    ④Required

    指示Web Service方法需要事务。由于Web服务方法只能作为根对象参与事务,因此将为 Web 服务方法创建一个新事务。

    [WebMethod(TransactionOption= TransactionOption.Required)]

    ⑤RequiresNew

    指示Web Service方法需要新事务。当处理请求时,将在新事务内创建Web Service。

    [WebMethod(TransactionOption= TransactionOption.RequiresNew)] 

    这里我们来看一个例子。

    首先在类代码中添加引用:using System.EnterpriseServices;,然后设置属性TransactionOption = TransactionOption.RequiresNew。

    例如:

    [WebMethod(TransactionOption = TransactionOption.RequiresNew)]

    public int DeleteProduct(string ProductId)

    {

        String deleteCmdSQL = "delete from P_Product where ProductId='" +

            ProductId + "'";

        String exceptionCmdSQL = "DELETE FROM NonExistingTable WHERE

            ProductId='" + ProductId + "'";

        SqlConnection sqlConn = new SqlConnection(

            Maticsoft.DBUtility.PubConstant.ConString);

        sqlConn.Open();

        SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL, sqlConn);

        SqlCommand exceptionCmd = new SqlCommand(exceptionCmdSQL, sqlConn);

        //这个命令正确执行          

        deleteCmd.ExecuteNonQuery();

        //这个命令执行时会发生异常,所以,第一个命令会自动回滚。因为这个方法被设置为事务模式

        //发生异常时,ASP.NET会自动中断事务并回滚

        int cmdResult = exceptionCmd.ExecuteNonQuery();

        sqlConn.Close();

        return cmdResult;

    }

    在上面的示例中,如果数据库操作引发异常,则事务将自动中止;否则将提交事务。

    l         CacheDuration:设置响应应在缓存中保留的秒数。这样Web Service就不需要重复执行多遍,可以提高访问效率,而CacheDuration就是指定缓存时间的属性。

    public static int i = 0;

    [WebMethod(EnableSession = true, CacheDuration = 30)]

    public int Count()

    {

        i = i + 1;

        return i;

    }

    在IE的地址栏里输入:http://localhost/WebService1/Service1.asmx/Count?。

    刷新它,内容一样!要使输出不一样,需等30秒。因为代码要在30秒后才被再次执行,之前返回的结果都是在服务器高速缓存里的内容。

    有两个问题可以影响ASP.NET 2.0 Web服务应用程序中的输出缓存。

    在ASP.NET 2.0中,测试页的HTTP方法已从Get更改为 Post。但是Post通常不进行缓存。如果在ASP.NET 2.0 Web 服务应用程序的测试页中改为使用Get,则缓存将正常工作。

    此外,HTTP指示用户代理(浏览器或调用应用程序)应该可以通过将“Cache-Control”设置为“no-cache”以重写服务器缓存。因此,当 ASP.NET 应用程序找到“no-cache”标头时,会忽略缓存的结果。

    l         BufferResponse:配置Web Service方法是否等到响应被完全缓冲完才发送信息给请求端。普通应用要等完全被缓冲完才被发送。

    在.NET中调用Web Service其实和创建Web Service一样简单。(完整代码示例位置:光盘\code\ch07\ WebAppClient)

    实现步骤如下。

    (1)首先我们创建一个ASP.NET Web 应用程序。

    (2)添加Web Service引用。

    在项目上单击鼠标右键,在弹出的快捷菜单中选择“添加Web 引用”命令,如图7-6所示,弹出“添加Web引用”对话框,如图7-7所示的窗口。

    000.jpg 001.jpg

    图7-6  选择“添加Web引用”命令                 图7-7  “添加Web引用”对话框

    添加引用分以下3种情况。

    l         如果是本解决方案中的Web服务,则选第一个,程序会自动转向解决方案中的服务地址。

    l         如果是本计算机上的Web服务,则系统会自动寻找本机的Web服务,供你选择。

    l         无论哪种情况,其最终目标都是在URL处输入相应的地址,进行加载,所以,我们可以在URL中输入Web服务的地址,无论是本地还是公网的都一样。然后,单击“前往”按钮,则会列出Web服务的测试页和方法描述,同时验证项目是否能够使用 Web 服务,如图7-8所示。

    002.jpg

    图7-8  预览Web 引用

    这时,我们在“Web引用名”文本框中,输入一个名称,我们将在代码中使用该名称以编程方式访问所选择的Web服务,单击“添加引用”按钮。

    (3)此时,项目中多了一个名叫Web References的目录,如图7-9所示,自动生成的代理类就放在这里。

    003.jpg

    图7-9  Web引用

    (4)单击工程中的解决方案资源管理器中的“显示所有文件”按钮,这时就可以看到那个代理类了,名叫Reference.cs。

    (5)在代码中使用这个代理类基本上和使用本地普通类一样。

    ProductService.LTPService service = new ProductService.LTPService();

    string price=service.GetProductPrice("001");

    到此为止,ASP.NET调用Web Service的过程就完成了,整个过程只写了两行代码。

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/timy/p/1627053.html
Copyright © 2011-2022 走看看