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

开发 后端
本文介绍了实现 Web 服务的一种更高效的方法:使用 Microsoft ASP.NET 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. public class MathService   
  3. {   
  4. [WebMethod]   
  5. public double Add(double x, double y) {   
  6. return x + y;   
  7. }   
  8. [WebMethod]   
  9. public double Subtract(double x, double y) {   
  10. return x - y;   
  11. }   
  12. public double Multiply(double x, double y) {   
  13. return x * y;   
  14. }   
  15. public double 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 子目录):

  1. < %@ 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. public class MathServiceJit   
  4. {   
  5. [WebMethod]   
  6. public double Add(double x, double y) {   
  7. return x + y;   
  8. }   
  9. [WebMethod]   
  10. public double Subtract(double x, double y) {   
  11. return x - y;   
  12. }   
  13. public double Multiply(double x, double y) {   
  14. return x * y;   
  15. }   
  16. public double 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 所示。

 .asmx 的 IIS 应用程序映射

图 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. < add verb="*" 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。

【编辑推荐】

  1. .NET框架基本要求(.NET1.1)
  2. P2PMessageQueue的实际用法
  3. 点对点消息队列函数:用于WinCE的IPC机制
  4. ASP.NET中无Cookie会话的优点与缺点
  5. 无Cookie会话的实现
责任编辑:yangsai 来源: MSDN
相关推荐

2009-05-18 09:12:59

JavaRuby on RaiMVC

2014-04-22 09:51:24

LongAdderAtomicLong

2013-07-23 10:50:24

C程序

2016-09-18 20:19:01

LinuxVimGitHub

2016-09-01 14:04:51

数据中心

2010-01-14 16:35:31

C++优化

2018-09-16 22:46:18

Mock单元测试集成测试

2017-12-21 14:36:10

大数据健身智慧

2018-05-08 14:58:07

戴尔

2016-10-27 17:49:07

群晖群晖科技NAS

2011-03-17 13:33:35

虚拟化网络交换机H3C

2017-01-12 10:38:04

TalkingData小程序

2010-12-23 15:55:00

上网行为管理

2010-01-06 13:57:03

解析JSON

2023-11-24 11:20:04

functoolsPython

2019-04-19 08:47:00

前端监控数据

2016-06-30 16:54:49

UCloud爱数云计算

2023-01-31 11:15:41

首席信息官云计算自动化

2024-08-19 00:35:00

Pythondict遍历列表推导式
点赞
收藏

51CTO技术栈公众号