ASP.NET Web Service如何工作(1)

Summary

ASP.NET Web Service 方法( WebMethods )怎样为创建 Web 服务提供一种高效的解决方案呢。 WebMethods 使传统的 Microsoft.NET 方法成为 Web 服务操作,它支持 HTTP XML XML Schema SOAP WSDL WebMethods .asmx )句柄将到来的 SOAP 消息派送给适当的方法,并将到来的 XML 元素串行化为对应的 .NET 对象。

Introduction

当今在 Microsoft.NET 中实现基于 HTTP Web 服务有两种根本不同的方法。第一种也是较低级的一种技术是编写一个定制的 IhttpHandler 类并把它嵌入到 HTTP 管道中。这种方法要求你使用 System.web API 处理到来的 HTTP 消息,用 System.Xml API 处理 HTTP 消息体中的 SOAP 封装( envelope )。编写一个定制的句柄同样也需要你手工编写 WSDL 文档,准确的描述实现过程。做到这一切要求对 XML XSD SOAP WSDL 规范有深入的了解,但这对大多数人来讲都是让人望而却步的先决条件。

实现 Web 服务的一种更高效的方法是使用 Microsoft ASP.NET WebMethods 框架。 ASP.NET .asmx 终节点(叫作 WebServiceHandler )装载了一个专门的 IhttpHandler 类,它为你的需要提供了 XML XSD SOAP WSDL 的功能性样板。因为 WebMethod 框架使你从底层 XML 技术的复杂性中解脱出来,可以将精力集中到一些紧要的业务问题。

 

选择一种实现技术涉及到在灵活性和高效性之间的权衡,如图 1 所示。一个定制的 IhttpHandler 有很大的灵活性,但却要花费大量的时间来编写、测试和调试代码。 WebMethods 框架使构建和运行 Web 服务变得异常轻松,不过很明显你将被限制在框架的界线里。不过,如果 WebMethods 框架不能正确的满足你的需要,也可通过填加你自己的功能来扩展框架。

总的来讲,除非你已经掌握了 XML XSD SOAP WSDL 并且愿意承受直接处理它们的负担,最好还是使用 WebMethods 框架来实现你的 Web 服务需要。它提供了大多数 Web 服务终点需要的基本服务,还有一些扩展属性使构架更适合你的具体需要。基于此假设,文章的余下部分我们将讨论 WebMethods 的内部工作机制。

WebMethods 框架

WebMethods 框架通过在方法开始处标记 [WebMethods] 属性,将 SOAP 消息映射到一个 .NET 类的方法, [WebMethods] 可以在 System.Web.Service 名称空间中找到。比如下面的 .NET 类包括四个方法,其中的两个被标注了 [WebMethods] 属性。

using System.Web.Services;

public class MathService

{

   [WebMethod]

   public double Add(double x, double y) {

      return x + y;

   }

   [WebMethod]

   public double Subtract(double x, double y) {

      return x - y;

   }

   public double Multiply(double x, double y) {

      return x * y;

   }

   public double Divide(double x, double y) {

      return x / y;

   }

}

要在 WebMethods 框架中使用这个类,需要把它编译成一个 assembly 并拷贝到虚拟目录的 bin 子目录下。在这个例子中, Add Subtract 方法被作为 Web 服务操作,而 Multiply Divide 却不能。(因为它们没有被标记为 [WebMethods]

你可以通过一个 .asmx 终节点来访问 Add Subtract Web 服务操作:创建一个文本文件 Math.asmx ,它包含下面的简单声明,然后把它放到包含 assembly 的同一个虚拟目录下(注这里是虚拟目录本身,而不是它的 bin 子目录)

<%@ WebService class="MathService"%>

这个声明告诉 .asmx 句柄去哪个类中查找 WebMethods ,余下的就由句柄全全处理。比如,假设虚拟目录叫作“ math ”,它包含了 Math.asmx ,它的 bin 子目录下包含了 assembly ,浏览 http://localhost/math/math.asmx .asmx 句柄将生成 文档。


关于 .asmx 句柄如何工作有一个主要的变化。 .asmx 文件通常只包含了 WebService 的声明,根据名字引用相应的 Web 服务类。因此,在这种情况下, assembly 必须已经被编译并且部署到虚拟目录的 bin 子目录中。 .asmx 句柄也提供了对 .asmx 文件源代码的即时编译( just-in-time compilation ),比如下面的文件就既包括了 WebService 声明,也包括了引用类的源代码。

<@% WebService class="MathServiceJit" language="C#"%>

using System.Web.Services;

public class MathServiceJit

{

   [WebMethod]

   public double Add(double x, double y) {

      return x + y;

   }

   [WebMethod]

   public double Subtract(double x, double y) {

      return x - y;

   }

   public double Multiply(double x, double y) {

      return x * y;

   }

   public double Divide(double x, double y) {

      return x / y;

   }

}

当此文件通过 HTTP 被第一次访问时, .asmx 句柄编译源码并将 assembly 部署到相应位置。注意 WebService 声明必须提供语言以使 .asmx 句柄在运行时能选择正确的编译器。这种方法明显的劣势就是直到第一次访问这个文件的时候你才会发现它的编译错误。

       当你在 Visual Studio.NET 中创建一个新的 Web Service 项目时,通常使用“双文件”技术,即类的源文件和引用它的 .asmx 文件是分开的。 IDE 会尽量屏蔽这些,如果你在 Solution Explorer 工具栏中点击 Show All Files ,你会注意到项目中 Web Service 类都有两个文件。事实上 Visual Studio.NET 不支持 .asmx 文件的 syntax highlighting or IntelliSense® 。对于 Web 项目, Visual Studio.NET 也负责创建一个虚拟目录,自动地将编译好的 assembly 放到虚拟目录的 bin 子目录下。

在我们详细讨论 .asmx 句柄如何工作之前,先来简单的看一下消息是怎样从 IIS 传递到 .asmx 句柄的。当一个 HTTP 消息到达 80 端口后, IIS 用在 IIS 元数据库中找到的信息决定由哪个 ISAPI.DLL 来处理消息。 .NET 安装时将 .asmx 扩展名映射到 Aspnet_isapi.dll

Aspnet_isapi.dll .NET 框架提供的标准的 ISAPI 扩展名,它只是简单的将 HTTP 请求传递到一个单独的工作者进程 Aspnet_wp.exe Aspnet_wp.exe hosts CLR (通用语言运行时)和 HTTP 管道。消息一旦进入了 HTTP 管道,管道就查找配置文件看哪个 IhttpHandler 类用来处理给定的扩展名。如果你查看你的 machine.config 文件,会看到它包含了一个映射到 .asmx 文件的 httphandler ,如下所示:

<configuration>

  <system.web>

    <httpHandlers>  

        <add verb="*" path="*.asmx" type="System.Web.Services.Protocols.WebServiceHandlerFactory,

System.Web.Services, Version=1.0.3300.0, Culture=neutral,

PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>

当一个访问 .asmx 文件的消息进入 .NET HTTP 管道时,管道就会调用 WebServiceHandlerFactory 类来实例化一个新的 WebServiceHandler 对象,用它来处理请求(通过调用 IhttpHandlerProcessRequest 方法)。 WebServiceHandler 对象打开物理的 .asmx 文件来决定包含你的 WebMethods 的类名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值