只有圖2中的這些接口,才屬於WCF的通道模型,在WCF中一樣提供了一些基類如CommunicationObject、ChannelFactoryBase等,在實現自定義的通道通訊對象時,也能夠直接繼承於這些基類,但要注意,這些基類僅僅是爲實現自定義通道通訊對象提供了方便,它們自己並不屬於通道模型的一部分。
ICommunicationObject接口爲WCF中全部面向通訊的對象提供了契約,除了通道、通道偵聽器、通道工廠外,還有調度程序和服務主機,定義了基本狀態的協定。它包括一組用於啓動狀態轉換的打開、關閉和停止方法,打開和關閉方法的異步版本,一組提供狀態轉換通知的事件和一個個用於檢查對象狀態的公開State屬性,它的定義以下所示:
public interface ICommunicationObject
{
// 狀態屬性
CommunicationState State { get; }
// 事件
event EventHandler Closed;
event EventHandler Closing;
event EventHandler Faulted;
event EventHandler Opened;
event EventHandler Opening;
// 方法
void Abort();
void Close();
void Close(TimeSpan timeout);
void Open();
void Open(TimeSpan timeout);
// 異步方法
IAsyncResult BeginClose(AsyncCallback callback, object state);
IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state);
IAsyncResult BeginOpen(AsyncCallback callback, object state);
IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state);
void EndClose(IAsyncResult result);
void EndOpen(IAsyncResult result);
}
ICommunicationObject 的初始狀態是「已建立」,此時能夠配置它的各類屬性。 一旦處於「已打開」狀態,對象就可用於發送和接收消息,但它的屬性將視爲不可變。 一旦處在「正在關閉」狀態,對象就不能再處理新的發送或接收請求,但在到達「關閉」超時前有可能完成現有的請求。 若是發生不可恢復的錯誤,則對象將轉換到「出錯」狀態,此時能夠檢查該對象以獲取有關錯誤的信息,該對象最終將關閉。 處於「已關閉」狀態時,該對象實質上已到達狀態機的終點。 對象一旦從一個狀態轉換到下一個狀態,它將不會返回至前一狀態,整個過程圖3所示:
圖 3
通道形狀
每一個通道均實現一個或多個接口,稱爲通道形狀接口或通道形狀。通道形狀的最底層是 IChannel 接口,該接口提供一個 GetProperty<T> 方法,用做訪問由通道堆棧中的通道公開的任意功能的分層機制。擴展 IChannel 的五種通道形狀爲:
1.IInputChannel:用於接收消息
2.IOutputChannel:用於發送消息
3.IRequestChannel:用於發送請求
4.IReplyChannel:用於發送回覆
5.IDuplexChannel:用於雙向消息傳遞
它們之間的關係如圖4所示:
圖 4
其實能夠看出,IDuplexChannel接口是IInputChannel和IOutputChannel接口的聯合,全部的通道形狀都同時擴展了ICommunicationObject和IChannel。這5種通道模型分別對應於不一樣的消息交換模式,在使用數據報模式時,消息發送方通道實現了IOutputChannel接口,而消息接收方通道實現了IInputChannel接口;在請求響應模式中,客戶端通道實現IRequestChannel接口,而服務通道實現IReplyChannel接口;在雙工通訊模式中,因爲雙方都能發送和接收消息,客戶端和服務通道實現了IDuplexChannel接口,如圖5所示:
圖 5
服務端通道
在通道對象模型中,除了IChannel接口,另一個接口IChannelListener用於消息的接收端,經過綁定來生成通道偵聽器(在綁定中有關於協議、編碼和傳輸的信息,關於綁定能夠參考
WCF專題系列(6):消息如何傳遞之綁定Part 1),用於偵聽傳入的消息。通道偵聽器負責建立通道並從下面的層或者從網絡接收消息,收到的消息將藉助於通道偵聽器所建立的通道傳送到上面的層中。整個過程如圖6所示:
圖 6
在WCF的內部,對於消息的每個處理(即通道堆棧中的通道),都會對應一個內部的通道偵聽器,如針對事務處理的TransactionChannelListener和使用TCP傳輸的TcpChannelListener,分別用於建立各自對應的通道。
客戶端通道
在WCF的客戶端,通道的建立使用通道工廠,建立的這些通道負責獲取來自上一層的消息,對消息進行必要的處理,而後將消息發送到下一層,如圖7所示:
圖 7
在WCF內部,一樣對於消息的每個處理,都會有相應的通道工廠,如使用TCP傳輸的TcpChannelFactory,用於建立對應的通道。
總結
本文詳細介紹了WCF中的通道編程模型以及關於通道、通道監聽器和通道工廠等,大多數都是純理論的知識,在下一篇文章中,將會經過一個示例來加深對於本文所講知識的認識。
©著做權歸做者全部:來自51CTO博客做者lihuijun的原創做品,如需轉載,請註明出處,不然將追究法律責任
掃一掃,領取大禮包git
Ctrl+Enter 發佈html
發佈java
取消jquery