WCF後傳系列(8):深度通道編程模型Part 1—設計篇

引言

從本質上說,WCF是一個通訊服務框架,它容許咱們使用不一樣的傳輸協議,使用不一樣的消息編碼形式,跟不一樣的WS-*系列規範交互,而全部這些細節都是由通道堆棧來處理的。爲了簡化這些處理,在WCF中提供了兩種模型,一是針對開發者的應用程序編程模型;二是用來通訊的通道模型,這樣對於開發者來講,只要瞭解應用程序編程模型就足夠了,而不會涉及到通道模型,然而,對於通道模型進行必要的學習,可讓咱們真正理解WCF中「通訊」概念,瞭解WCF的 整個架構體系,從而構建出更加健壯的WCF服務或者對WCF框架進行擴展。在本文中,咱們將進行深度瞭解WCF中的通道模型是如何設計的。

通道模型概述

在WCF中,提供了一系列的接口和其它類型模型,它們爲消息的發送和接收提供了一個底層的編程模型,該模型稱之爲WCF通道模型。在通道模型中,一個很重要的概念是通道堆棧,它是具備一個或多個消息處理通道的分層的通訊堆棧,堆棧中放置了各類類型的通道,用來對象進行處理,如在通道堆棧的最底層放置了傳輸通道,它負責使通道堆棧適應基礎傳輸,如圖1所示:
TerryLee_WCF_23
圖1
在通道堆棧中,不只僅提供消息的傳輸方式,還提供了其它諸如對消息的內容或者消息頭進行處理的功能,這些功能一樣是以通道的方式放置在通道堆棧中,甚至於咱們能夠編寫本身的通道,加入到通道堆棧中。
消息在通道堆棧中傳輸時,將做爲Message對象流過通訊堆棧,如傳輸通道負責在發送方和接收方之間轉換消息,以後消息將經過傳輸通道繼續往上流,依次通過通道堆棧中的各個通道,這些通道各自負責提供一種通訊功能,如在消息頭中添加信息,對消息的正文進行加密等等。

通道對象模型

通道對象模型是實現通道、通道偵聽器和通道工廠所必需的一組核心接口。還提供一些基類以輔助自定義實現。能夠看到通道模型中最重要的有三組接口:通道、通道偵聽器和通道工廠。每一個通道均實現一個或多個接口,稱爲通道形狀接口或通道形狀;通道偵聽器負責偵聽傳入消息,即在消息的接收端,而後經過由通道偵聽器建立的通道將這些消息傳送到上面的層;通道工廠負責建立通道用於發送消息,即在消息的發送方,並在通道工廠關閉時,關閉通道工廠建立的全部通道。
在通道模型中,最重要的一個接口是ICommunicationObject,它定義了全部通訊對象實現的基本狀態機的核心接口,自定義通道通訊對象能夠直接實現ICommunicationObject,如圖2所示:
TerryLee_WCF_24
圖2
只有圖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所示:
TerryLee_WCF_30
圖 3

通道形狀

每一個通道均實現一個或多個接口,稱爲通道形狀接口或通道形狀。通道形狀的最底層是 IChannel 接口,該接口提供一個 GetProperty<T> 方法,用做訪問由通道堆棧中的通道公開的任意功能的分層機制。擴展 IChannel 的五種通道形狀爲:
1.IInputChannel:用於接收消息
2.IOutputChannel:用於發送消息
3.IRequestChannel:用於發送請求
4.IReplyChannel:用於發送回覆
5.IDuplexChannel:用於雙向消息傳遞
它們之間的關係如圖4所示:
TerryLee_WCF_25
圖 4
其實能夠看出,IDuplexChannel接口是IInputChannel和IOutputChannel接口的聯合,全部的通道形狀都同時擴展了ICommunicationObject和IChannel。這5種通道模型分別對應於不一樣的消息交換模式,在使用數據報模式時,消息發送方通道實現了IOutputChannel接口,而消息接收方通道實現了IInputChannel接口;在請求響應模式中,客戶端通道實現IRequestChannel接口,而服務通道實現IReplyChannel接口;在雙工通訊模式中,因爲雙方都能發送和接收消息,客戶端和服務通道實現了IDuplexChannel接口,如圖5所示:
TerryLee_WCF_29
圖 5

服務端通道

在通道對象模型中,除了IChannel接口,另一個接口IChannelListener用於消息的接收端,經過綁定來生成通道偵聽器(在綁定中有關於協議、編碼和傳輸的信息,關於綁定能夠參考 WCF專題系列(6):消息如何傳遞之綁定Part 1),用於偵聽傳入的消息。通道偵聽器負責建立通道並從下面的層或者從網絡接收消息,收到的消息將藉助於通道偵聽器所建立的通道傳送到上面的層中。整個過程如圖6所示:
TerryLee_WCF_26
圖 6
在WCF的內部,對於消息的每個處理(即通道堆棧中的通道),都會對應一個內部的通道偵聽器,如針對事務處理的TransactionChannelListener和使用TCP傳輸的TcpChannelListener,分別用於建立各自對應的通道。

客戶端通道

在WCF的客戶端,通道的建立使用通道工廠,建立的這些通道負責獲取來自上一層的消息,對消息進行必要的處理,而後將消息發送到下一層,如圖7所示:
TerryLee_WCF_27
圖 7
在WCF內部,一樣對於消息的每個處理,都會有相應的通道工廠,如使用TCP傳輸的TcpChannelFactory,用於建立對應的通道。

總結

本文詳細介紹了WCF中的通道編程模型以及關於通道、通道監聽器和通道工廠等,大多數都是純理論的知識,在下一篇文章中,將會經過一個示例來加深對於本文所講知識的認識。

0javascript

收藏css

lihuijun

203篇文章,74W+人氣,0粉絲

Ctrl+Enter 發佈html

發佈java

取消jquery

掃一掃,領取大禮包git

0ajax

分享
lihuijun
相關文章
相關標籤/搜索