九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
WebService工作原理

WebService工作原理 [圖片]

Freer 2010年05月11日 22:40 閱讀(75) 評(píng)論(0) 分類(lèi):Web+SQL

    

    寫(xiě)WebService有一段時(shí)間了,把自己收集的和理解的關(guān)于WebService工作原理做個(gè)總結(jié).


    WebService主要采用了Http協(xié)議,Http是個(gè)基于Tcp/Ip的應(yīng)用層協(xié)議:(注:現(xiàn)在的大部分WebService開(kāi)發(fā)已經(jīng)能很好的支持socket的實(shí)時(shí)通信了.但http依然是它的精髓.)

    Http采用了"請(qǐng)求-----應(yīng)答"模式;

    Http通信是通過(guò)XML串行化通信的......

    Http通信過(guò)程:調(diào)用.asmx句柄,XMLXSD、SOAPWSDL處理,

    XML中主要提供的有三方面:(下面文章引自:http://dev.csdn.net/article/19/19185.shtm)

    個(gè)人感覺(jué)主要要掌握的是SOAP請(qǐng)求消息和應(yīng)答消息的xml格式...


消息分派

當(dāng).asmx句柄被HTTP管道調(diào)用時(shí),通過(guò)查看.asmx文件中的WebService聲明,確定檢查哪個(gè).NET類(lèi)。然后它觀察到來(lái)的HTTP消息中的信息,確定調(diào)用引用類(lèi)中的哪個(gè)方法。為了調(diào)用前面例子中的Add方法,HTTP請(qǐng)求消息應(yīng)像下面一樣:

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

上面的HTTP請(qǐng)求消息中有兩條信息可以用來(lái)確定調(diào)用類(lèi)中的哪個(gè)方法:SOAPAction頭或soap體中請(qǐng)求元素的名字。在這個(gè)例子中,每種方法都指出了發(fā)送者想調(diào)用的方法名。

.asmx句柄使用SOAPAction頭的值來(lái)實(shí)現(xiàn)消息的分派。因此,.asmx句柄查看消息中的SOAPAction頭,使用.NET映射檢查引用類(lèi)中的方法。它只考慮標(biāo)記了[WebMethod]屬性的方法,但通過(guò)查看每種方法的SOAPAction值再具體確定調(diào)用哪個(gè)方法。因?yàn)槲覀冊(cè)陬?lèi)中并沒(méi)有明確的指定SOAPAction的值,.asmx句柄認(rèn)為SOAPAction的值是Web服務(wù)的名稱(chēng)空間加上方法名。而且我們也沒(méi)有指定名稱(chēng)空間,所以句柄就把http://tempuri.org作為默認(rèn)值。這樣Add方法的默認(rèn)SOAPAction值就是http://tempuri.org/Add。

可以按如下方法定制Web服務(wù)的名稱(chēng)空間。把類(lèi)標(biāo)記上[WebService]屬性,用[SoapDocumentMethod]屬性標(biāo)記WebMethods來(lái)指定具體的SOAPAction值。示例如下:

using System.Web.Services;
using System.Web.Services.Protocols;
 
[WebService(Namespace="http://example.org/math")]
public class MathService
{
   [WebMethod]
   public double Add(double x, double y) {
      return x + y;
   }
   [WebMethod]
   [SoapDocumentMethod(Action="urn:math:subtract")]
   public double Subtract(double x, double y) {
      return x - y;
   }
   ...
}

現(xiàn)在.asmx句柄認(rèn)為Add方法的SOAPAction值是http://example.org/math/Add,SubTract的值是urn:math:subtract(因?yàn)槲覀冊(cè)陬?lèi)中明確定義了)。比如下面的HTTP請(qǐng)求消息調(diào)用Subtract
POST /math/math.asmx HTTP/1.1

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

如果.asmx句柄沒(méi)為HTTP請(qǐng)求消息找到一個(gè)SOAPAction匹配,將會(huì)拋出一個(gè)異常。如果你不想依賴(lài)SOAPAction頭來(lái)分派消息,可以引導(dǎo).asmx句柄使用請(qǐng)求元素名稱(chēng)。采用這種方法需要為類(lèi)標(biāo)記上[SoapDocumentService]屬性的RoutingStyle特性,同時(shí)也應(yīng)該指出WebMethods不需要SOAPAction值(在類(lèi)中設(shè)定其值為空)。如下所示:

using System.Web.Services;
using System.Web.Services.Protocols;
 
[WebService(Namespace="http://example.org/math")]
[SoapDocumentService(
  RoutingStyle=SoapServiceRoutingStyle.RequestElement)]
public class MathService
{
   [WebMethod]
   [SoapDocumentMethod(Action="")]
   public double Add(double x, double y) {
      return x + y;
   }
   [WebMethod]
   [SoapDocumentMethod(Action="")]
   public double Subtract(double x, double y) {
      return x - y;
   }
    ...
}

在這種情況下,句柄甚至不關(guān)心SOAPAction的值,它使用請(qǐng)求元素的名字確定調(diào)用方法。比如,在下面的HTTP請(qǐng)求消息中,它希望調(diào)用Add方法的請(qǐng)求元素的名字是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>

所以當(dāng).asmx句柄接收到HTTP消息時(shí)它要做的第一件事情就是決定如何分派消息到對(duì)應(yīng)的WebMethod。在它真正調(diào)用方法之前,還需要將到來(lái)的XML映射到.NET對(duì)象。

XML映射到對(duì)象

一旦WebMethod句柄決定了調(diào)用哪個(gè)方法,它就會(huì)將XML消息反串行化為.NET對(duì)象。隨著消息分派,句柄通過(guò)reflection檢查類(lèi),然后決定怎樣處理XML消息。XmlSerializer類(lèi)自動(dòng)完成XMLSystem.Xml.Serialization名稱(chēng)空間中類(lèi)的映射。

XmlSerializer能實(shí)現(xiàn)任何.NET公共類(lèi)型到XML Schema類(lèi)型的映射,有了這個(gè)適當(dāng)?shù)挠成?,它能自?dòng)的實(shí)現(xiàn).NET對(duì)象和XML實(shí)例文檔的映射(見(jiàn)圖4)。XmlSerializerXML Schema所支持功能的限制,雖不能處理所有復(fù)雜的現(xiàn)代對(duì)象模型(如非樹(shù)型的對(duì)象圖),卻能處理開(kāi)發(fā)者常用的復(fù)雜類(lèi)型。

再看前面Add的例子,XmlSerializer將把xy元素映射為.NETdouble值(調(diào)用Add方法時(shí)必須提供的)。Add方法返回一個(gè)double類(lèi)型值給調(diào)用者,這也需要被串行化為SOAP應(yīng)答消息中的一個(gè)XML元素。

Figure 4. Mapping XML to objects

XmlSerializer也能自動(dòng)處理一些復(fù)雜類(lèi)型(除了上面說(shuō)到的一些限制)。比如,下面的WebMethod計(jì)算兩個(gè)點(diǎn)結(jié)構(gòu)之間的距離。

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));
  }
}

請(qǐng)求此操作的SOAP消息將包含一個(gè)Distance元素,它包含了兩個(gè)子元素,一個(gè)稱(chēng)作orig,另一個(gè)是dest,每一個(gè)都包括了xy元素,如下所示:

<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>

這種情況下SOAP應(yīng)答消息將包含一個(gè)DistanceResponse元素,它包含一個(gè)double 類(lèi)型的DistanceResult子元素。

<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Body>
    <DistanceResponse 
      xmlns="urn:geometry">
      <DistanceResult>5</DistanceResult> 
    </DistanceResponse>
  </soap:Body>
</soap:Envelope>

缺省的XML映射使用方法名作為請(qǐng)求元素名,參數(shù)名作為子元素名。每個(gè)參數(shù)的結(jié)構(gòu)依賴(lài)于類(lèi)型的結(jié)構(gòu)。公共字段和屬性的名字簡(jiǎn)單映射為子元素,如Point類(lèi)中的xy。應(yīng)答元素的名字缺省為請(qǐng)求元素的名字后面附加上“Response,應(yīng)答元素也包含一個(gè)子元素,是請(qǐng)求元素名字后面附加“Result”。也有可能使用一些固定的映射屬性來(lái)打破標(biāo)準(zhǔn)的XML映射。比如,你可以使用[XmlType]屬性來(lái)定制類(lèi)型的名字和名稱(chēng)空間,使用[XmlElement][XmlAttribute]屬性來(lái)控制如何將參數(shù)或類(lèi)成員分別映射為元素或?qū)傩裕部梢允褂?/span>[SoapDocumentMethod]屬性控制怎樣把方法本身映射為請(qǐng)求/響應(yīng)消息中的元素名。比如,檢查下面重新定義的Distance

using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
 
public class Point {
  [XmlAttribute]
  public double x;
  [XmlAttribute] 
  public double y;
}
[WebService(Namespace="urn:geometry")]
public class Geometry {
  [WebMethod]
  [SoapDocumentMethod(RequestElementName="CalcDistance",
     ResponseElementName="CalculatedDistance")]
  [return: XmlElement("result")]
  public double Distance(
    [XmlElement("o")]Point orig, [XmlElement("d")]Point dest) {
    return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
                     Math.Pow(orig.y-dest.y, 2));
  }
}

它所期望的SOAP請(qǐng)求消息如下:

<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Body>
    <CalcDistance xmlns="urn:geometry">
      <o x="0" y="0" />
      <d x="3" y="4" />
    </CalcDistance>
  </soap:Body>
</soap:Envelope>

并將產(chǎn)生下面的應(yīng)答消息:

<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Body>
    <CalculatedDistance xmlns="urn:geometry">
      <result>5</result>
    </CalculatedDistance>
  </soap:Body>
</soap:Envelope>

.asmx句柄使用SOAP document/literal風(fēng)格來(lái)實(shí)現(xiàn)和描述上面顯示的默認(rèn)映射。意思上說(shuō)WSDL定義將包含literal XML schema定義,它描述了SOAP消息中用到的請(qǐng)求和響應(yīng)元素。

.asmx句柄也能使用SOAP rpc/encoded風(fēng)格。這意味著SOAP體中包含一個(gè)RPC調(diào)用的XML代表(representation),參數(shù)用SOAP編碼規(guī)則來(lái)串行化。實(shí)現(xiàn)這些僅需將[SoapDocumentService] and [SoapDocumentMethod]替換為[SoapRpcService] and [SoapRpcMethod]屬性。

正如你所看到的,我們可能完全定制一個(gè)從給定方法到SOAP消息的映射。XmlSerializer提供了一個(gè)強(qiáng)大的串行化引擎。

除了處理參數(shù)的反串行化,.asmx句柄也能串行化/反串行化SOAP頭。SOAP頭的處理不同于參數(shù),因?yàn)樗鼈儽徽J(rèn)為是典型的無(wú)法控制的信息,和具體的方法沒(méi)有直接的聯(lián)系。由于這些,頭處理主要是通過(guò)中間層(interception layers),完全為WebMethods屏蔽了頭處理。

然而如果想涉足于WebMethod中的頭信息,你必須提供一個(gè).NET類(lèi),從SoapHeader派生而來(lái),它代表了頭的XML schema類(lèi)型。然后定義一個(gè)此類(lèi)型的成員變量作為每一個(gè)頭實(shí)例的占位符。最后標(biāo)記每個(gè)要訪問(wèn)頭的WebMethod,指定你想要到達(dá)的域名。

比如,下面的SOAP請(qǐng)求包括一個(gè)用來(lái)進(jìn)行身份驗(yàn)證的UsernameToken頭。

<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>
  <soap:Header>
    <x:UsernameToken xmlns:x="http://example.org/security">
      <username>Mary</username>
      <password>yraM</password>
    </x:UsernameToken>
  </soap:Header>
  <soap:Body>
    <CalcDistance xmlns="urn:geometry">
       ...

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
jmeter壓測(cè)學(xué)習(xí)47-發(fā)soap請(qǐng)求測(cè)試webservice接口
Java調(diào)用.net的WebService - 阿善的日志 - 網(wǎng)易博客
通過(guò)HttpClient請(qǐng)求webService
WebService學(xué)習(xí)整理(一)
JAVA 調(diào)用Web Service的方法 - 輕松 的博客 - 博客園
PHP5 擴(kuò)展SOAP 調(diào)用 webservice
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服