天天看點

WCF後傳系列(2):深入WCF尋址Part 2—自定義尋址報頭

了解了Web服務尋址規範,再回到WCF,在WCF中,終結點位址是由EndpointAddress類來表示的,它其中很重要的幾個部分是:一個表示服務位址的統一資源定位符 (URI),一個表示服務的安全辨別的 Identity 和一個可選的 Headers 集合,其中Headers用于辨別終結點或與終結點互動的更多詳細尋址資訊。如圖1所示:

圖1

<a href="http://11011.net/software/vspaste"></a>

在WCF中提供了基址技術,這使的我們在指定終結點位址時可以酌情選用相對位址或者絕對位址,指定絕對位址的方法是在終結點定義中提供完全限定的位址,如下代碼所示:

使用絕對位址固然簡單,但是如果我們的服務需要公開多個終結點,而這些終結點位址又具有相同的基位址時,也許相對位址是更好的選擇。在建立服務宿主對象時,提供一個基位址,如下代碼所示:

又或者同時在配置檔案中指定基位址,這樣就無須在每個終結點中指定絕對位址了,如下代碼所示:

但請注意,基址技術是為我們在配置終結點時提供了友善,用戶端對它是毫無所知的,用戶端看到的仍然是絕對位址,在打開服務宿主時,它會比對所有的相對位址,進而為每個終結點提供相應的絕對位址,如上面的示例,可以在WSDL中看到:

如果在指定了基位址的情況下,有以下幾種情況:指定相對位址為空,終結點位址與基位址相同;指定相對位址不為空,追加相對位址到基位址上;指定一個絕對位址,基位址不起作用,終結點位址仍然為指定的絕對位址;指定一個絕對位址和一個與基位址不同的綁定,基位址不起作用。現在有這樣一段配置資訊:

可以在ServiceHost啟動後,輸出所有的終結點位址和綁定資訊,如下代碼:

輸出結果如圖2所示:

圖2

終結點位址在WSDL中表示為對應終結點的 wsdl:port元素内的終結點引用(EndpointReference)元素。終結點引用包含終結點的位址以及所有的位址屬性,如下示例代碼所示:

在本文的終結點定義一節,我們提到了尋址報頭,在某些情況下,我們可能希望通過自定義尋址報頭來解決一些複雜的問題,如根據根據傳入的尋址報頭中是否包含某些資訊,将其轉發到不同的終結點,通過自定義尋址報頭,可以實作SOAP消息的無限擴充,放置任何希望的控制資訊到SOAP消息。如下面的代碼:

我們在WSDL中可以看到該自定義的報頭,它作為終結點引用的引用參數:

截獲到SOAP消息可以看到,在消息報頭中添加了basic這樣的資訊,如下代碼所示:

當然我們也可以通過配置的方式來自定義尋址報頭,如下代碼所示:

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/31/WCF-Addressing-ListenUri-and-EndpointAddress.html">WCF專題系列(5):深入WCF尋址Part 5—邏輯位址和實體位址</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/30/WCF-Addressing-Part3-Customize-Message-Filter.html">WCF專題系列(4):深入WCF尋址Part 4—自定義消息篩選器</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/27/WCF-Addressing-Part3-Message-Filter.html">WCF專題系列(3):深入WCF尋址Part 3—消息過濾引擎</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/25/WCF-addressing-part1.html">WCF專題系列(1):深入WCF尋址Part 1—Web服務尋址規範</a>

本文轉自lihuijun51CTO部落格,原文連結:http://blog.51cto.com/terrylee/151929 ,如需轉載請自行聯系原作者

繼續閱讀