[匯入]WCF後傳系列(1):深入WCF定址Part 1—Web服務定址規範

來源:互聯網
上載者:User
概述

眾所周知,WCF服務的所有通訊都是通過服務的終結點發生的,每個 服務端點都包含一個地址Address、一個綁定Binding 和一個契約Contract。契約指定可用的操作,綁定指定如何與服務進行通訊,而地址指定尋找服務的位置,即非常經典的“ABC”。WCF用多種不同的通訊協定為公開服務端點和與其通訊提供了靈活的模式,在WCF專題系列的第一部分,我將圍繞終結點的定址細節展開討論,再此之前,我們先看一下WCF的編程模型,1所示:

圖1

Web服務定址規範

在 WCF 中,端點位址是按照Web服務定址 WS-Addressing 規範中的定義建立終結點引用(Endpoint Reference,EPR)的模型,我們有必要對Web服務定址規範來做一個認識,這裡先提出一個問題,為什麼需要Web服務定址?一方面SOAP如果要做到真正的與傳輸協議無關,就要以一種與傳輸協議無關的方式來定義訊息的接收者與訊息返回的地址;另一方面,定義定址資訊有助於在發生網路錯誤或丟失響應的情況下將訊息返回給要求者;最後一套完善的定址機制使的複雜的互動模式成為可能,2所示:

圖2

在WS-Addressing中,其實就兩個概念:終結點引用(Endpoint Reference)和SOAP結構的訊息資訊前序(Message Information Headers)。如下面的樣本表示將一條SOAP 1.2的訊息發送到http://fabrikam123.com/Purchasing。:

<S:Envelope xmlns:S="http://www.w3.org/2002/12/soap-envelope"   xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing">  <S:Header>    <wsa:ReplyTo>      <wsa:Address>http://business456.com/client1</wsa:Address>    </wsa:ReplyTo>    <wsa:To>http://fabrikam123.com/Purchasing</wsa:To>    <wsa:Action>http://fabrikam123.com/SubmitPO</wsa:Action>  </S:Header>  <S:Body>    ......  </S:Body></S:Envelope>

終結點引用

Web 服務終結點是一個可以引用的實體、處理器或可以作為 Web 服務訊息目標的資源,而終結點引用傳達了標識或者引用一個 Web 服務終結點所需的資訊,它的使用方式可以有多種:終結點引用適用於傳達訪問 Web 服務終結點所需的資訊,也可以在 Web 服務間往返的各條訊息提供地址。如下面的代碼錶示了終結點引用的資訊集:

<wsa:EndpointReference>  <wsa:Address>xs:anyURI</wsa:Address>  <wsa:ReferenceProperties>... </wsa:ReferenceProperties> ?  <wsa:ReferenceParameters>... </wsa:ReferenceParameters> ?  <wsa:PortType>xs:QName</wsa:PortType> ?  <wsa:ServiceName PortName="xs:NCName"?>xs:QName</wsa:ServiceName> ?  <wsa:Policies> ... </wsa:Policies>?  <xs:any/>*</wsa:EndpointReference>

從最簡單的意義上來說,終結點引用就是一些使用XML元素來封裝的URL,如下面的代碼:

<wsa:myLocation>  <wsa:Address>http://localhost:8887/CalculatorService</wsa:Address></wsa:myLocation>

這裡wsa:myLocation就是終結點引用,在它的內部是一個Web服務定址規範定義的元素,用它來指定當訪問CalculatorService服務時所用的地址。作為終結點引用模型的一部分,每個終結點引用都可以包含一些添加額外標識資訊的引用參數。

訊息資訊前序

訊息資訊前序(Message Information Headers)是Web 服務定址規範定義了一些附加的也是標準的SOAP頭,它們用於協助傳送關於訊息的資訊,它與終結點引用不同,訊息資訊前序將作為SOAP Head的擴充包含在SOAP訊息中,它的資訊集如下所示:

<wsa:To>xs:anyURI</wsa:To> ?<wsa:From>wsa:EndpointReferenceType</wsa:From> ?<wsa:ReplyTo>wsa:EndpointReferenceType</wsa:ReplyTo> ?<wsa:FaultTo>wsa:EndpointReferenceType</wsa:FaultTo> ?<wsa:Action>xs:anyURI</wsa:Action><wsa:MessageID>xs:anyURI</wsa:MessageID> ?<wsa:RelatesTo RelationshipType="xs:anyURI"?>xs:anyURI</wsa:RelatesTo> *<wsa:ReferenceParameters>xs:any*</wsa:ReferenceParameters> ?

下面我們對其做一些解釋:

To:表示目標 Web 服務的 URL,當使用端點引用(EPR)時,To 頭應該與 <wsa:Address> 元素具有相同的值。

From:表示訊息發送方的終結點引用,如果訊息接收方需要向發送訊息的終結點發送回訊息,那麼它應該使用這個終結點引用。

ReplyTo:表示來自於Web服務的任何響應都應該被發送給ReplyTo終結點引用,即訊息的發送方並不一定是要接收響應訊息的終結點,這和From是有區別的。

FaultTo:如果訊息的響應是SOAP錯誤,那麼這個錯誤應該在 FaultTo頭中發送給終結點引用。

MessageID:用來唯一的識別訊息。

Action:對於Action可以這麼理解,當訊息發送的服務時,指定如何處理該訊息,更簡單一點,就是希望服務調用哪個方法來處理訊息。如下代碼所示,希望訊息到達服務時,調用Add方法來處理。

<wsa:Action>http://tempuri.org/ICalculator/Add</wsa:Action>

RelatesTo:RelatesTo常用在響應訊息中,用來指示它與先前知道的訊息相關並且定義這種關係的URI。這在請求響應模式中非常關鍵,尤其是非同步訊息傳遞中,響應訊息的接收方必須能夠將它與原始請求訊息相關聯。

我們把訊息資訊前序Message Information Headers與SOAP用圖3來清晰的表示:

圖3

有關WS-Addressing規範的詳細資料大家可以參考http://www.w3.org/Submission/ws-addressing/。

分析WCF訊息

上面我介紹了Web服務定址規範,現在我們截獲一下WCF的訊息,來看看它是如何符合WS-Addressing的。現在編寫一個簡單的WCF服務:

/// <summary>/// Author: TerryLee/// Url:http://www.cnblogs.com/terrylee/// </summary>[ServiceContract]public interface ICalculator{    [OperationContract]    int Add(int x, int y);}public class CalculatorService : ICalculator{    public int Add(int x, int y)    {        return x + y;    }}

我們可以用跟蹤診斷的方式來截獲到SOAP訊息,如下所示,可以看到這個調用服務過程中,訊息前序中的To地址以及Action,這裡的Action就是我們在服務中定義的Add方法,以及訊息的Body:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Header>    <To s:mustUnderstand="1">http://localhost:8887/CalculatorService</To>    <Action s:mustUnderstand="1">http://tempuri.org/ICalculator/Add</Action>  </s:Header>  <s:Body>    <Add xmlns="http://tempuri.org/">      <x>1</x>      <y>2</y>    </Add>  </s:Body></s:Envelope>

結束語

Web服務定址規範帶來了Web服務世界的定址標準,它通過定義終結點引用(Endpoint Reference)和訊息資訊前序(Message Information Headers)來提供了一種統一的機制。在下一篇中,我將繼續深入分析WCF中的定址,WCF定址相關文章:

WCF專題系列(5):深入WCF定址Part 5—邏輯地址和物理地址

WCF專題系列(4):深入WCF定址Part 4—自訂訊息篩選器

WCF專題系列(3):深入WCF定址Part 3—訊息過濾引擎

WCF專題系列(2):深入WCF定址Part 2—自訂定址前序

--------------------------
新聞:中國雅虎重建銷售團隊 賺錢提上戰略高度
導航:部落格園首頁  知識庫  新聞  招聘  社區  小組  博問  網摘  找找看
文章來源:http://www.cnblogs.com/Terrylee/archive/2008/10/25/WCF-addressing-part1.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.