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);}