WCF在設計的時候,就封裝了對常用協議如Tcp\HTTP\MSMQ的處理機制。但WCF同時也允許
開發者在WCF現有平台上進行擴展,以解決實際問題。
大部分情況下,通過WCF常用的協議,就已經能完成了大部分工作了。在WCF揭秘中,作者
在介紹如何擴展WCF時,講了一些WCF是如何處理行為、信道、傳輸等方面的工作機制。本節從
WCF行為作為切入點,談談個人對WCF體系的理解。
在WCF框架設計時,為了簡化WCF普通的應用場景,也為了滿足一些特殊環境下的應用,
WCF的設計者們將WCF進行分成設計。實現方式是將上層 與底層應用區分開。
在一些特殊環境下對底層做一些擴展就行了。WCF將一般場景使用的的上層應用類型都放在
System.ServiceModel中。而對底層的擴展主要針對的類型放在System.ServiceModel
.Dispatcher與System.ServiceModel.Channels
這兩個命名空間中。本節介紹的消息在Client與Server中大致處理流程
WCF客戶端與服務端交互過程是怎樣的呢。?首先看下圖:
過程說明:
1、Client發起服務調用,客戶端操作組件對調用參數進行檢查,並序列化到System.ServiceModel.Channels.Message對象中。
2、客戶端運行時組件通過IMessageInspectors對消息進行檢查並將請求信息通過Channel發往Server
3、Service Endpoint的調度器(Dispatcher)從信道層中獲取請求消息交給信道調度器
4、信道調度器然后將消息交給終結點調度器。
5、根據消息地址,操作調度器決定消息與服務契約定義的操作匹配
6、調用操作器將參數傳遞給實現該接口的操作並進行調用。
7、如果調用有返回,則響應消息被傳遞給信道調用器,由信道調用器將響應信息放入信道中,
回復給客戶端。
在這個過程中,還有一些具體的問題,如在WCF服務端,調度器(Dispatcher)如何工作?
下面分服務端、客戶端分別介紹
服務端:調度器(Dispatcher)。
調度器負責從信道中獲取數據,並傳遞給終結點相應的方法以進行處理。在這個過程中涉及到的調度器(Dispatcher)有三種:信道調度器(Channel Dispather)、終結點調度器(Endpoint Dispatcher)、操作調度器(Opeartion Dispatcher)。
過程說明:
1、信道調度器從信道中獲取數據,並根據讀取到的消息的地址決定將消息發送給哪個終結點。
2、終結點調度器根據消息的Action,決定消息所對應的接口操作。然后將消息發送給操作調度器。
3、操作調度器接收到消息以后,對它進行反序列化以獲取接口需要的參數,並將參數傳遞給方法。
處理完成以后,還將對響應消息進行序列化。
調度器(Dispatcher)由三種類型進行定義:ChannelDispatcher、DispatcherRuntime、DispatcherOperation。
ChannelDispatcher定義了服務層的信道調度器。
DispatcherRuntime代表終結點調度器層的組件。
DispatcherOperation代表操作相關的調度器組件。
客戶端:
在WCF的客戶端,客戶端運行時組件主要由兩類定義:1、System.ServiceModel.Dispatcher.ClientOperation、
2、System.ServiceModel.Dispatcher.ClientRuntime。
1、ClientOperation類
它有兩個重要的屬性來附加相關的行為:
1、參數檢查器:ParameterInspectors。在ClientOperation中的定義:
public SynchronizedCollection<IParameterInspector> ParameterInspectors { get; } public interface IParameterInspector { // Methods void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState); object BeforeCall(string operationName, object[] inputs); }
2、附加定制行為的屬性:Formatter:負責將發送的數據序列化到消息里,也就是System.ServiceModel.Channles.Message對象的Body中。在ClientOperation中的定義:
public IClientMessageFormatter Formatter { get; set; } public interface IClientMessageFormatter { // Methods object DeserializeReply(Message message, object[] parameters); Message SerializeRequest(MessageVersion messageVersion, object[] parameters); }
2、ClientRuntime類也有兩個屬性來附加終結點的行為:
1、OperationSelector:它通過Client調用的哪個方法決定進行哪個方法的調用。在ClientRuntime中的定義:
public IClientOperationSelector OperationSelector { get; set; } public interface IClientOperationSelector { // Methods string SelectOperation(MethodBase method, object[] parameters); // Properties bool AreParametersRequiredForSelection { get; } }
2、MessageInspector:它用於檢查並有選擇性的修改發送的請求消息和接收到的響應消息。在ClientRuntime中的定義:
public SynchronizedCollection<IClientMessageInspector> MessageInspectors { get; } public interface IClientMessageInspector { // Methods void AfterReceiveReply(ref Message reply, object correlationState); object BeforeSendRequest(ref Message request, IClientChannel channel); }