• 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的过程就完成了,整个过程只写了两行代码。

  • 相关阅读:
    月薪3万+的大数据人都在疯学Flink,为什么?
    Flink应用场景
    Flink生态与未来
    flink学习笔记-split & select(拆分流)
    .NET MVC5简介(四)Filter和AuthorizeAttribute权限验证
    .NET MVC5简介(三)Result
    .NET MVC5简介(二)
    VUE基础实用技巧
    .NET MVC5简介(一)
    WebApi简介
  • 原文地址:https://www.cnblogs.com/timy/p/1627053.html
Copyright © 2020-2023  润新知