您的位置:首页 > 编程语言 > ASP

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

2009-10-13 10:23 337 查看

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
的类名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: