WebMethod框架:实现Web服务的更高效方法

摘要:
第一个也是最低级别的方法是编写自定义IHttpHandler类并将其插入。NET HTTP管道。使用系统。用于处理HTTP主体中找到的SOAP封装的Xml API。编写自定义处理程序还需要手动编写准确描述实现的WSDL文档。此类提供了所需的可重复XML、XSD、SOAP和WSDL函数。
WebMethod框架:实现Web服务的更高效方法
关键词:WebMethod

  在 Microsoft .NET 中,目前有两种截然不同的方法来实现基于 HTTP 的 Web 服务。第一种同时也是最低级的方法是编写一个自定义 IHttpHandler 类并将它插入到 .NET HTTP 管道中。这种方法要求您使用 System.Web API 来处理传入的 HTTP 消息,使用 System.Xml API 来处理在 HTTP 主体中找到的 SOAP 封装。编写自定义处理程序还要求您手动编写一个精确描述您的实现的 WSDL 文档。要正确地做好这一切,需要对 XML、XSD、SOAP 和 WSDL 规范有深入的了解,但这个先决条件使大多数人望而却步。

  实现 Web 服务的一种更高效的方法是使用 Microsoft ASP.NET WebMethod框架。ASP.NET 为 .asmx 终结点附带了一个特殊的 IHttpHandler 类(名为 WebServiceHandler),该类提供您所需的可反复套用的 XML、XSD、SOAP 和 WSDL 功能。由于 WebMethod 框架使您从复杂的基础 XML 技术中解脱出来,因此您可以将精力迅速集中到手头的业务问题上。

灵活性和工作效率之间的折中

  图 1. 灵活性和工作效率之间的折衷

  在实现技术之间进行选择就会形成如图 1 中所示的灵活性和工作效率之间常见的折衷。编写自定义的 IHttpHandler 会为您提供极大的灵活性,但却要花大量的时间来编写、测试和调试代码。WebMethod 框架使迅速生成和运行 Web 服务变得非常轻松,但是您无疑将受到该框架边界的限制。但是,如果 WebMethod框架不能完全满足您的需要,也可以通过添加自己的额外功能来扩展该框架。

  WebMethod框架

  WebMethod框架围绕将 SOAP 消息映射到 .NET 类上的方法来设计。这通过首先用在 System.Web.Services \命名空间中找到的 [WebMethod] 属性批注您的方法来完成。例如,下面的 .NET 类包含四种方法,其中的两种方法用 [WebMethod] 属性进行批注:

  

  1. using System.Web.Services;  
  2. publicclass MathService  
  3. {  
  4. [WebMethod]  
  5. publicdouble Add(double x, double y) {  
  6. return x + y;  
  7. }  
  8. [WebMethod]  
  9. publicdouble Subtract(double x, double y) {  
  10. return x - y;  
  11. }  
  12. publicdouble Multiply(double x, double y) {  
  13. return x * y;
  14. }  
  15. publicdouble Divide(double x, double y) {  
  16. return x / y;  
  17. }  
  18. }  

  要在 WebMethod框架中使用该类,需要将该类编译成程序集,然后将它复制到虚拟目录的 bin 目录中。在本例中,Add 和 Subtract 方法随后可被公开为 Web 服务操作,而 Multiply 和 Divide 却不能(因为它们没有被标记为 [WebMethod])。

  通过 .asmx 终结点将 Add 和 Subtract 公开为 Web 服务操作。为此,要新建一个名为 Math.asmx 且包含以下简单声明的文本文件,然后将它放到包含该程序集的同一虚拟目录中(注:这是放在虚拟目录本身中,而不是它的 bin 子目录):

  < %@ WebService class="MathService"%>

  上面的声明通知 .asmx 处理程序要在哪个类中查找 WebMethod,该处理程序就会神奇地处理其余所有事情。例如,假设虚拟目录的名称为 ''math'',它包含 Math.asmx 以及一个包含该程序集的 bin 子目录,浏览到 http://localhost/math/math.asmx 会导致 .asmx 处理程序生成如图 2 所示的文档页(后面会对此进行详述)。

  关于 .asmx 处理程序如何工作有一个很大的变化。.asmx 文件通常只包含 WebService 声明,该声明根据名称引用 Web 服务类(这与上面显示的声明相似)。因此,在本例中,程序集必须已经被编译和部署到虚拟目录的 bin 目录中。对于在 .asmx 文件中找到的源代码,.asmx 处理程序还提供实时编译。例如,下面的文件(名为 Mathjit.asmx)包含 WebService 声明以及被引用类的源代码。

 

  1. < @% WebService class="MathServiceJit" language="C#"%>  
  2. using System.Web.Services;  
  3. publicclass MathServiceJit  
  4. {  
  5. [WebMethod]  
  6. publicdouble Add(double x, double y) {  
  7. return x + y;  
  8. }  
  9. [WebMethod]  
  10. publicdouble Subtract(double x, double y) {  
  11. return x - y;  
  12. }  
  13. publicdouble Multiply(double x, double y) {  
  14. return x * y;  
  15. }  
  16. publicdouble Divide(double x, double y) {  
  17. return x / y;  
  18. }  
  19. }  

  当通过 HTTP 首次访问此文件时,.asmx 处理程序会编译源代码并将程序集部署到正确的位置。请注意,WebService 声明还必须提供语言,以便 .asmx 处理程序在运行时能够选择正确的编译器。这种方法的明显缺点是,只有在首次访问该文件之后,才会发现编译错误。

MathService

  图 2. MathService 文档

  当您在 Visual Studio? .NET 中新建一个 Web 服务项目时,总是使用“双文件”技术,即类的源文件与引用它的 .asmx 文件是分开的。集成开发环境 (IDE) 尽量地对文件进行了隐藏,但是如果您在 Solution Explorer 工具栏上单击 Show All Files,将会注意到该项目中的每个 Web 服务类都有两个文件。实际上,Visual Studio .NET 并不支持 .asmx 文件的语法突出显示或 IntelliSense?,所以,如果您朝着这个方向设计,则必须依靠自己。对于 Web 项目,Visual Studio .NET 也负责自动创建一个虚拟目录并将程序集编译到该虚拟目录的 bin 目录中。

  在详细讨论 .asmx 处理程序如何工作之前,让我们先简单讨论一下消息如何从 Internet Information Server (IIS) 传递到 .asmx 处理程序。当传入的 HTTP 消息到达端口 80 时,IIS 使用在 IIS 元数据库中找到的信息来确定应当使用哪个 ISAPI DLL 来处理消息。.NET 安装程序将 .asmx 扩展名映射到 Aspnet_isapi.dll,如图 3 所示。

WebMethod框架:实现Web服务的更高效方法第3张

  图 3. .asmx 的 IIS 应用程序映射

  Aspnet_isapi.dll 是 .NET 框架提供的标准的 ISAPI 扩展名,它只是将 HTTP 请求转发到一个名为 Aspnet_wp.exe 的单独的辅助进程。Aspnet_wp.exe 宿主公共语言运行库和 .NET HTTP 管道。当消息进入 .NET HTTP 管道之后,该管道会在配置文件中进行查找,看对于给定的扩展名应当使用哪个 IHttpHandler 类。如果您在 Machine.config 文件中进行查找,则会发现它包含 .asmx 文件的 httpHandler 映射,如下所示:

  

  1. <configuration>
  2. <system.web>
  3. <httpHandlers>
  4. <addverb="*"path="*.asmx"type="System.Web.Services.Protocols.WebServiceHandlerFactory,   
  5. System.Web.Services, Version=1.0.3300.0, Culture=neutral,   
  6. PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
  7. ...  

  因此,当消息进入面向 .asmx 文件的 .NET HTTP 管道时,该管道会调用 WebServiceHandlerFactory 类,以便实例化新的 WebServiceHandler 对象,该对象可用于处理请求(通过调用 IHttpHandlerProcessRequest 方法)。WebServiceHandler 对象随后打开物理 .asmx 文件,以便确定包含 WebMethod 的类的名称。有关 .NET HTTP 管道如何工作的详细信息,请查看 HTTP Pipelines:Securely Implement Request Processing, Filtering, and Content Redirection with HTTP Pipelines in ASP.NET。

  当 .asmx 处理程序由 .NET HTTP 管道调用之后,它会开始神奇地处理 XML、XSD、SOAP 和 WSDL。

—摘抄自其他网

免责声明:文章转载自《WebMethod框架:实现Web服务的更高效方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇信息系统设计Resharper的配置和使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python爬取中文页面的时候出现的乱码问题

一、读取返回的页面数据 在浏览器打开的时候查看源代码,如果在头部信息中指定了UTF-8 那么再python代码中读取页面信息的时候,就需要指定读取的编码方式: response.read().decode('utf-8') 二、把中文数据写入到文件的时候 python默认的是按照ACSII的编码往外写,所以中文数据往外写肯定会出现乱码 那么再往外写入文件的...

SpringBoot入门及YML文件详解

SpringBoot 简介 微框架,与 Spring4 一起诞生,基于约定、生来为了简化 spring 的配置 优点 可以快速的上手,整合了一些子项目(开源框架或者第三方开源库) 可以依赖很少的配置快速的搭建项目 基于 spring 使开发者快速入门,门槛很低。 可以创建独立运行的应用而不需要依赖容器 提供很多 maven 极简配置,缺点是会引入很多不需...

python下编译py成pyc和pyo

其实很简单,用python -m py_compile file.py python -m py_compile /root/src/{file1,file2}.py编译成pyc文件。也可以写份脚本来做这事:Code: import py_compile py_compile.compile('path') //path是包括.py文件名的路径 用py...

静态代理和动态代理的区别

什么是静态代理: 打一个最简单的比方,我现在想要学习,那么就必须得把书包拿过来,把书掏出来,准备好纸笔,然后开始学习,等学完了我还得收拾书,把书塞回书包里,还得整理一下书包,这是一个完整的学习的过程,但是我很懒,不想动弹,只想学习,那可能就得让妈妈帮我把书包拿过来,把书打开,我只管学习就好了,学完以后,妈妈再帮我把书整理好放回去.(我这是打个什么破比方.....

AVD模拟器怎么配置上网

转自:http://blog.csdn.net/you_jinjin/article/details/7228303 方法一 首先,Windows下,配置Adroid环境变量(Win7为例) 1、桌面右键——》我的电脑——》高级系统设置 2、高级——》环境变量——》系统变量——》Path 3、添加Android SDK目录到系统变量Path中,如下图:...

Docker Toolbox安装

公司最近搭建docker环境,其中会遇到一些问题,在这里记录一下。 先来了解一下docker 一、基本概念 1.Docker中基本概念镜像(Image)  提到镜像,有对操作系统有一定认知的都知道,镜像是一个压缩的ISO文件,里面包含操作系统运行所需要的运行环境以及库文件,配置文件等等。从认识上简单的来说,镜像就是面向对象中的类,相当于一个模板。从本质上来...