中繼路由器

這個範例會示範如何實作服務,而這個服務會提供在網路組態中 (用戶端在此可能無法直接存取服務) 十分有用的基本路由功能。這個範例不是用於具有各方面功能,有效且可擴充之路由器的例子。

ms751497.note(zh-tw,VS.90).gif注意:
此範例的安裝程序與建置指示位於本主題的結尾。

在與 SOAP 媒介相關的一般通訊案例中,用戶端傳送的訊息在抵達其最終目的之前,會在一或多個其他服務中周遊,而這最終目的就是實際處理訊息,並提供回應 (若預期有回應的話) 的服務。SOAP 媒介可以在通過的訊息上執行各種動作。例如,快取媒介可將快取的回應傳回訊息,即可減輕必須再次處理要求之服務的壓力。負載平衡媒介會使用循環配置資源演算法,將訊息轉寄至其中一個可能的服務。結構描述驗證媒介只會轉寄完全遵循合約之 XSD,也可能完全遵循其他通訊協定的訊息。對此範例開發的媒介則會負責根據訊息的標頭和內容,將訊息路由至適當的服務。

如需 SOAP 訊息的詳細資訊,請參閱 XML Web Service Wire Formats

在此範例中,會部署兩個應用程式服務來處理用戶端要求:計算機服務和回應服務。您只能從內部網路存取服務的應用程式端點。而服務的中繼資料交換 (MEX) 端點則可讓大眾存取。SOAP 路由器是內部網路的一部分,而所有來自內部網路以外所有應用程式要求都必須通過此路由器。

您可以對這兩個服務執行Service Model Metadata Utility Tool (Svcutil.exe) 即可建立用戶端,並在 Svcutil.exe 將組態資料從第二個服務合併至對第一個服務執行 Svcutil.exe 所建立的現有組態檔時,產生兩個程式碼檔案 (每個服務各一個用戶端) 和一個組態檔。每個服務提供的 Web 服務描述語言 (WSDL) 包含 SOAP 媒介位址,卻不包含實際服務的位址。這樣便可讓用戶端隨意修改組態檔,或可確知 SOAP 媒介的位址。

再者,您會使用兩個端點設定此範例中的路由器服務,其一會使用 HTTP for SOAP 1.2 接聽以文字編碼的訊息,另一個會使用 TCP for SOAP 1.2 接聽二進位編碼的訊息。每個應用程式服務的 WSDL 都會在路由器上使用正確的端點位址。在包含下列屬性的組態檔 appSettings 區段中,除了提供路由資訊之外也會提供路由器:

  • prefixesnamespaces,用來更新 WCF 中的預設 XmlNamespaceManager,這樣便能解析路由器 XPaths 中的前置詞。
  • xpathepr,用來將路由項目新增至路由表,而這個路由表會將 XPaths 對應至 EPRs

路由器會使用 XpathMessageFilterTable (XPathFilterTable<T>) 類別,其中 "T" 是存放使用者提供之路由項目的 EndpointAddress。接收到訊息時,路由器會呼叫在 Message 執行個體中傳遞的 MatchMultiple 方法,並擷取轉寄訊息目的之 EndpointAddress

EchoServiceCalculatorService 都會使用 ListenUri 屬性來設定端點正在接聽的 URI。端點宣告內提供的位址是路由器端點的位址,而這個路由器端點可以轉寄服務訊息。這是出現在服務 WSDL 中的位址,而該位址也符合每個傳入訊息的 WS-Addressing To 標頭。不過,ListenUri 屬性提供的位址是只能讓傳輸使用之端點的實際實體接聽位址。

WCF 會提供另一個通常會在 SOAP 媒介案例中使用,但在此範例中不會討論的行為:ClientViaBehavior 通道行為。用戶端會使用 ClientViaBehavior,以指定傳輸通道應該建立的 URI。如果用戶端端點上的行為集合中存在這類行為,傳輸就會使用所提供的 URI,而堆疊中的所有其他通道層,則會使用 ChannelFactory 建構階段時提供的 EndpointAddress。這個 EndpointAddress 也會變成 WS-Addressing To 標頭。下列程式碼範例會顯示使用此行為的方式。

ChannelFactory<IContract> factory = new ChannelFactory<IContract>(new EndpointAddress("http://hostname/service"));
factory.Endpoint.Behaviors.Add(new ClientViaBehavior(new Uri("http://hostname/intermediary")));
IContract channel = factory.CreateChannel(); 

與 SOAP 媒介搭配使用的其他 WCF 功能為 AddressFilter 屬性。WCF 會使用 AddressFilter,僅接受符合特定篩選條件的訊息。如果服務合約的方法使用 "*" 做為 Action,則只會檢查位址。因為該位址一定正確,所以這個範例便不會使用此功能。因為 To 標頭符合其端點位址,所以路由器會接受用戶端的訊息,而因為服務的 To 標頭符合其端點邏輯位址,服務便會接受轉寄至服務的訊息。

範例的 Contracts.cs 檔案會定義下列四個介面,每個介面各適用於一種傳輸模式:

  • ISimplexDatagramRouter. 在單工資料包通道上接受訊息時,需要用到此介面。如果您預期是在單向 HTTP 通道或雙向 TCP 和 NamedPipe 通道上接收訊息,請使用此介面新增端點。
  • IRequestReplyDatagramRouter. 在要求-回覆資料包通道上接受訊息時,需要用到此介面。針對雙向 HTTP 通道上的訊息使用此介面。
  • ISimplexSessionRouter. 這個介面必須接受單工工作階段通道上的訊息。針對單工 TCP 和單工 NamedPipe 通道使用此介面。
  • IDuplexSessionRouter. 這個介面適用於雙工工作階段通道。針對雙工 TCP 和雙工 NamedPipe 通道使用此介面。

RouterBinding 會提供您可建立的 WCF 繫結範例,以支援 SOAP 媒介。您可在這裡指定使用此案例需要的最常用設定,並確定只會新增真正需要的那些繫結項目。其中也會示範基本組態支援。

這個範例不會使用 Web 主機,因為這個主機使用 HTTP 以外的傳輸。目前僅在 Windows Vista 和 IIS 7.0 支援使用 TCP 啟動。

當您執行範例時,作業要求和回應會顯示在用戶端主控台視窗中。在用戶端視窗中按下 ENTER 鍵,即可關閉用戶端。

Echo("Is anyone there?") returned: Is anyone there?
Add(5) returned: 5
Add(-3) returned: 2

若要設定、建置及執行範例

  1. 若要建置方案的 C#、C++ 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。

  2. 若要在單一或多台電腦組態中執行此範例,請遵循執行 Windows Communication Foundation 範例中的指示,不過會有下列例外。

    1. 在單一電腦和多部電腦的組態中,您會需要四個專案和四個可執行檔;分別用於用戶端、SOAP 路由器和每個應用程式服務。
    2. 在多部電腦組態中,您必須對這四個組態檔進行下列變更。
      必須對 CalculatorServiceEchoService,變更 App.config 檔的第 21 行。媒介的實際主機名稱必須取代 localhost 主機名稱。
      路由器 App.config 檔的第 15 行必須變更。這兩個位址 (以 '|' 區隔) 必須分別變更為 EchoServiceCalculatorService 的主機名稱。
      用戶端 App.config 檔的第 5 行和第 7 行必須變更。媒介的實際主機名稱必須取代 localhost 主機名稱。
      您也可以對這兩個應用程式服務 (一旦更新為使用正確的位址) 使用Service Model Metadata Utility Tool (Svcutil.exe),並重新產生 App.config 檔。
  3. 啟動用戶端之前,請確定 RouterEchoServiceCalculatorService 都正在執行中。這三個服務都會列印出啟動時所接聽的端點位址。

    ms751497.note(zh-tw,VS.90).gif注意:
    EchoService 和 CalculatorService 的應用程式端點會使用路由器的位址。

  4. 執行該用戶端。用戶端會先聯絡 EchoService,然後聯絡 CalculatorServiceRouter 則會列印出來回轉寄訊息的 WS-Addressing 動作。

    ms751497.note(zh-tw,VS.90).gif注意:
    如果 Client.exe 和 Router.exe 位於不同的電腦上,請取消註解 Client.exe.config 中的 <identity/> 區段,並將使用者主要名稱設定為其中一位執行 Router.exe 的使用者。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.