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

为了使 .asmx 句柄有可能反串行化 SOAP 头,首先你需要定义一个 .NET 类,它代表了暗含的 XML Schema 类。在此例中相应的类如下:

[XmlType(Namespace="http://example.org/security")]


[XmlRoot(Namespace="http://example.org/security")]


public class UsernameToken : SoapHeader {


   public string username;


   public string password;


}

然后你需要在 WebMethod 类中定义一个成员变量来控制一个头类的实例,同样要为 WebMethods 标记 [SoapHeader] 属性。见如下:

using System;


using System.Web.Services;


using System.Web.Services.Protocols;


 


 [WebService(Namespace="urn:geometry")]


public class Geometry {


 


  public UsernameToken Token;


 


  [WebMethod]


  [SoapHeader("Token")]


  public double Distance(Point orig, Point dest) {


    if (!Token.username.Equals(Reverse(Token.password)))


       throw new Exception("access denied");


 


    return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +


                     Math.Pow(orig.y-dest.y, 2));


  }


}

这样,在 WebMethod 中你可以访问 Token 域,并提取 SOAP 头提供的信息。你也可以使用同样的技术将头信息送回客户端——你需要在 [SoapHeader] 属性声明中指定头的方向。

.asmx 句柄也提供了 .NET 异常的自动串行化。任何被 .asmx 句柄劫获的未处理的异常都会被自动串行化为应答消息中的 SOAP Fault 元素。比如,在前面的例子中,假如用户名与反转的口令不匹配,我们的代码将会抛出一个 .NET 异常。 .asmx 句柄劫获这个异常,将它串行化为下面的 SOAP 应答:

 1<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 2    
 3    
 4      <soap:body>
 5    
 6    
 7        <soap:fault>
 8    
 9    
10          <faultcode>soap:Server</faultcode>    
11    
12    
13          <faultstring>Server was unable to process request. --&gt; access denied</faultstring>
14    
15    
16          <detail></detail>
17    
18    
19        </soap:fault>
20    
21    
22      </soap:body>
23</soap:envelope>

如果你想更多的控制 SOAP Fault 元素,也可以通过指定所有 SOAP Fault 元素细节来明确抛出一个 SOAP 异常对象。比如: faultcode, faulstring, faultactor, detail 元素。

领会 WebMethods 如何工作需要理解根本的串行化引擎和它的各种选项。串行化引擎的好处就是它隐藏了定制句柄中底层的 XML API 代码。然而尽管许多开发人员认为这样很好,一些人也认为这也是它的缺陷,因为他们想亲手来处理 WebMethod 中未经加工的 SOAP 消息。

自动生成 WSDL 文档

写好并部署了一个 WebMethod 后,客户需要明确知道和它成功通信 SOAP 消息应该是个什么样子。提供 Web 服务描述的标准方法是通过 WSDL (和嵌入的 XSD 定义)。 .asmx 句柄自动的生成了人性化的可读文档和 WSDL 定义,它准确的反映了 WebMethod 接口。如果在你的 WebMethods 中应用了一些映射属性,它们将都被反映在生成的文档中。

假如你浏览这个 .asmx 文件,你将看到一个人性化的可读文档页面就像图 2 中显示的那样。这个文档页是由 DefaultWsdlHelpGenerator.aspx ( 在 C:\windows\Microsoft.NET\Framework\v1.0.3705\config 中 ) 生成的。打开这个文件你会看到它就是一个标准的 ASP.NET 页面,它使用 .NET reflection 生成那个文档。这个特点使文档一直与代码同步,可以通过简单的修改这个文件来定制你的生成文档。

也可以在 Web.config 文件中指定一个不同的文档文件来绕过基于虚拟目录文档生成器:

 1<configuration>
 2    
 3    
 4      <system.web>
 5    
 6    
 7        <webservices>
 8    
 9    
10          <wsdlhelpgenerator href="MyDocumentation.aspx"></wsdlhelpgenerator>
11    
12    
13        </webservices>
14    
15    
16        ...
17
18如果客户端发出请求  .asmx  终点,且请求字符串后加“?  wsdl  ”,  .asmx  句柄将生成一个  WSDL  定义而不是一个人性化的可读文档。客户端可以使用  WSDL  定义生成代理类,它自动的知道怎样和  Web  服务通信。 
19
20要定制  WSDL  生成过程,你可以写一个  ** SoapExtensionReflector  ** 类并在你的  Web.config  文件中注册到  WebMethods  框架。然后当  .asmx  句柄生成  WSDL  定义时,它将会调用你的反映类(  reflector  )使你有机会定制提供给用户的最后定义。 
21
22同样你也可以采用两种技术来绕过  WSDL  生成过程。首先,可以在你的虚拟目录下提供一个静态的  WSDL  文档供客户访问,然后从  Web.config  文件中除去文档生成器(如下所示)。 
23    
24    
25    <configuration>
26    
27    
28      <system.web>
29    
30    
31        <webservices>
32    
33    
34          <protocols>
35    
36    
37            <remove name="Documentation"></remove>
38    
39    
40          </protocols>
41    
42    
43          ...
44
45另外一个比较自动化的技术是使用  [WebServiceBinding]  属性来指定  WebMethod  类实现的静态  WSDL  文档在虚拟目录中的位置,也要用  [SoapDocumentMethod]  属性为每一个实现的  WebMethod  指定  WSDL  绑定的名字。这样做以后,自动  WSDL  生成过程将会导入你的静态  WSDL  文件,生成一个新的服务描述。 
46
47手工编写  WSDL  是极端困难的,因为现在没有很多  WSDL  编辑器。因此自动文档  /WSDL  生成是  WebMethod  框架中有价值的一部分。没有它,许多开发者的日子会很难过的。 
48
49###  总结 
50
51ASP.NET WebMethods  框架为创建  WEB  服务提供了高效的方法。  WebMethods  使得传统的  .NET  方法能够成为支持  HTTP  、  XML  、  XML Schema  和  WSDL  的  Web  服务操作。  WebMethod  (  .asmx  )句柄自动决定怎样将到来的  SOAP  请求消息分派到适当的方法,然后又将请求消息中的  XML  元素串行化为相应的  .NET  对象。为简化集成客户端,  .asmx  句柄也支持可读文档和  WSDL  的生成。 
52
53和自己定制的  IhttpHandlers  相比,尽管  WebMethods  框架有点受限,它还是提供了称为  SOAP  扩展框架的强大扩展模型。  SOAP  扩展允许你引入我们上面没有讨论到的额外功能来满足你的具体需要。比如,微软发布了  Web Serivices Enhancements1.0  ,它提供了  SoapExtension  类,为  WebMethods  框架引入了几个  GXA  规范的支持。 
54
55ASD  全球范围内寻找能够应您的需求供应服务或产品的企业,发布您所能提供的服务或产品以供其他  DDFDFDFDFDFD  商业实体来发现,这是全球商家的期望。 
56
57为满足这一商业需求,技术领域和商业领域的领导者们启动了  UDDI  计划,通过紧密地协作,开发和制订  UDDI  规范,并部署  UDDI  服务。  UDDI(Universal Description, Discovery and Integration),  统一描述、发现和集成协议,是开放的、基于  Internet  的新一代电子商务技术标准。</webservices></system.web></configuration></system.web></configuration>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus