打印本文 打印本文 关闭窗口 关闭窗口
ASP.NET Web Service如何工作(2)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2960  更新时间:2009/4/23 10:50:41  文章录入:mintao  责任编辑:mintao
   [WebMethod]
   [SoapDocumentMethod(Action="")]
   public double Subtract(double x, double y) {
      return x - y;
   }
    ...
}

在这种情况下,句柄甚至不关心SOAPAction的值,它使用请求元素的名字确定调用方法。比如,在下面的HTTP请求消息中,它希望调用Add方法的请求元素的名字是Add:

POST /math/math.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: ""
<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Body>
    <Add xmlns="http://example.org/math">
      <x>33</x>
      <y>66</y>
    </Add>
  </soap:Body>
</soap:Envelope>

所以当.asmx句柄接收到HTTP消息时它要做的第一件事情就是决定如何分派消息到对应的WebMethod。在它真正调用方法之前,还需要将到来的XML映射到.NET对象。

将XML映射到对象

一旦WebMethod句柄决定了调用哪个方法,它就会将XML消息反串行化为.NET对象。随着消息分派,句柄通过reflection检查类,然后决定怎样处理XML消息。XmlSerializer类自动完成XML和System.Xml.Serialization名称空间中类的映射。

XmlSerializer能实现任何.NET公共类型到XML Schema类型的映射,有了这个适当的映射,它能自动的实现.NET对象和XML实例文档的映射(见图4)。XmlSerializer受XML Schema所支持功能的限制,虽不能处理所有复杂的现代对象模型(如非树型的对象图),却能处理开发者常用的复杂类型。

再看前面Add的例子,XmlSerializer将把x和y元素映射为.NET的double值(调用Add方法时必须提供的)。Add方法返回一个double类型值给调用者,这也需要被串行化为SOAP应答消息中的一个XML元素。

Figure 4. Mapping XML to objects

XmlSerializer也能自动处理一些复杂类型(除了上面说到的一些限制)。比如,下面的WebMethod计算两个点结构之间的距离。

using System;
using System.Web.Services;
public class Point {
  public double x; 
  public double y;
}
[WebService(Namespace="urn:geometry")]
public class Geometry {
  [WebMethod]
  public double Distance(Point orig, Point dest) {
    return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
                     Math.Pow(orig.y-dest.y, 2));
  }
}

请求此操作的SOAP消息将包含一个Distance元素,它包含了两个子元素,一个称作orig,另一个是dest,每一个都包括了x和y元素,如下所示:

<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Body>
    <Distance xmlns="urn:geometry">
      <orig>
        <x>0</x>
        <y>0</y>
      </orig>
      <dest>
        <x>3</x>
        <y>4</y>
      </dest>
    </Distance>
  </soap:Body>
</soap:Envelope>

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口