WCF專題系列(1):深入WCF尋址Part 1—Web服務尋址規范
概述
眾所周知,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服務時所用的地址。作為終結點引用模型的一部分,每個終結點引用都可以包含一些添加額外標識信息的引用參數。