通道形狀介紹
通道形狀是我們對通道進行分類的重要依據之一。概念上,一個通道形狀對 應於一個或多個消息交換模式(MEPs),第3章“消息交換模式、拓撲與編排”裡 曾經討論過這個概念。為了說明問題,考慮一下發送者和接收者使用請求/應答 模式來交換消息的情況。在請求/應答模式裡,發送者發送消息給接收者,接收 者回復消息給發送者,請求消息和應答消息之間的關系是固定的。因為通道是發 送者和接收者交換消息的物理途徑,發送者和接收者必須建立它們自己的通道。 當發送者和接收者通過請求 /應答模式來交換消息的時候,發送者和接收者必須 理解請求/應答模式的規則。在結構上來說,這意味著發送者上的通道要定義發 送消息和接收消息的成員。此外,發送者和接收者需要定義關聯請求消息和應答 消息的成員。
咋一看,發送者和接收者有著相同的角色。例如,發送者和接收者都可以發 送和接收消息。邏輯上的區別就是發送和接收消息過程中的順序不同。這意味著 發送者和接收者上的通道會略有不同。這些不同點體現在發送者和接收者通道裡 定義的成員上。通道形狀是我們命名和劃分這些不同點的方式。因為.NET接口是 鑒別.NET類型成員的天然方式,所以它們也是區別通道形狀的最佳方式。
WCF類型系統定義了幾個描述不同通道形狀的接口,這些接口與第三章裡講述 的消息交換模式一一對應。圖6-2列舉了消息交換模式(MEP)、發送者和接受之 間的對應關系。這些接口都定義在System.ServiceModel.Channels命名空間下。
圖6-2消息交換模式(MEP)與通道形狀的關系 MEP Sender Receiver 數據報 IOutputChannel IInputChannel 請求/應答 IRequestChannel IReplyChannel 雙工 IDuplexChannel IDuplexChannel P2P IDuplexChannel IDuplexChannel
注意,這裡報文和請求/應答模式的接口是不同的。對於報文MEP,發送者發 送一個消息,但是不能接收消息,而請求/應答模式是可以的。記住, IOutputChannel 定義了一個名為Send的方法,而IInputChannel定義了一個名為 Receive的方法。
這裡還需要解釋一下表6-2裡的雙工MEP。記住雙工MEP裡,發送者和接收者都 可以發送和接受消息。在成員級別上,兩者都可以定義一個名為一個名為Send和 一個名為Receive的方法。
實際上,消息程序需要把多個消息關聯到一起。例如,一個交易系統(發送 者)也許要發送關於一個交易訂單或者產品的多個消息到財務系統(接收者)。 這個關聯的邏輯邊界就是會話(session)。當第一次考慮這些會話的時候,很 容易理解為接收者會根據發送者來關聯這些消息。這樣一來,很自然地就會猜想 ,同時處理5個發送者請求的接收者將會把消息關聯到一個特定的發送者上,正 像ASP.NET程序處理來自於多個浏覽器的請求消息一樣。在WCF應用程序裡,這些 耦合過於緊密以至於不能滿足過多的消息需求。例如,一個交易系統(發送者) 或許發送多個訂單有關的消息,財務系統(接收者)也許要根據需訂單實例而不 是交易系統(發送者)來關聯這些消息。
WCF會話是一個通道級別的構造。因為這個概念也就是為了關聯消息,每個通 道都自己關聯消息的方式。例如,TCP/IP 通道能夠根據接收消息的socket來關 聯同一個會話裡的消息。與之相對的是,實現了WS-ReliableMessaging規范的通 道,可以在消息頭裡使用ID屬性來關聯同一個會話裡的消息,所以,這也就不需 要依賴具體的socket或者傳輸結構了,就可以實現同一個會話裡消息的關聯。
所有支持會話的通道的一個共同特性就是它們可以擁有自己的標識符,WCF基 礎結構裡的不同模塊都可以使用這個標識符來關聯消息。概念上看,通道需要實 現System.ServiceModel.Channels.ISessionChannel<T>接口來會支持會 話。ISessionChannel<T>的泛型參數必須實現 System.ServiceModel.Channels.ISession接口。下面代碼展示了這些接口裡的 成員:
public interface ISession {
String Id { get; }
}
public interface ISessionChannel<T> where T: ISession {
T Session { get; }
}
如代碼所示,接口暴露了一個名為Id的成員,這個成員表示一個會話標識符 。在WCF 裡,實現了ISessionChannel<T>接口的通道類型被稱為會話通道 。為了連貫性考慮,WCF裡把會話作為通道形狀的一個變量考慮。換句話說, IDuplexChannel接口包含一個名為IDuplexSessionChannel的變量。從通道形狀 的角度來看,IDuplexSessionChannel與IDuplexChannel的通道形狀不同,盡管 它們都能夠實現雙工通信。兩者真正的區別在於 IDuplexSessionChannel實現了 ISessionChannel<T>接口。表6-3列舉了WCF類型系統裡的會話通道形 狀.
圖6-3消息交換模式(MEP)與會話通道形狀的關系 MEP Sender Receiver 數據報 IOutputSessionChannel IInputSessionChannel 請求/應答 IRequestSessionChannel IReplySessionChannel 雙工 IDuplexSessionChannel IDuplexSessionChannel P2P IDuplexSessionChannel IDuplexSessionChannel
備注:與上一節裡介紹的“通道狀態機”相反,這裡只有通道才會實現通道形 狀接口,並且需要一個表示通道形狀接口的引用。
【老徐備注】
1.三種 MEP:
數據報(IInputChannel 和 IOutputChannel)
使用數據報 MEP 時,客戶端使用“啟動後不管”的交換形式發送消息。“啟 動後不管”交換形式是一種要求對成功傳遞做帶外確認的交換形式。消息在傳輸 過程中可能會丟失,而永遠不能到達服務。如果在客戶端成功完成發送操作,這 並不保證遠程終結點已經收到消息。數據報是消息傳遞的基本構造塊,因為您可 以在它上面構建自己的協議,包括可靠的協議和安全的協議。客戶端數據報通道 實現 IOutputChannel 接口,而服務數據報通道實現 IInputChannel 接口。
請求-響應(IRequestChannel 和 IReplyChannel)
在此 MEP 中會發送一個消息並收到一個答復。此模式由請求-響應對組成。請 求-響應調用的示例是遠程過程調用 (RPC) 和浏覽器的 GET 請求。此模式也稱 為半雙工。在此 MEP 中,客戶端通道實現 IRequestChannel,而服務通道實現 IReplyChannel。
雙工 (IDuplexChannel)
雙工 MEP 允許客戶端發送任意數量的消息,並且這些消息可以以任何順序接 收。雙工 MEP 就像電話通話,所說的每一個字都是一條消息。由於在這種 MEP 下雙方都能發送和接收,由客戶端和服務通道實現的接口是 IDuplexChannel。
http://msdn.microsoft.com/zh-cn/library/aa751829.aspx