WCF體系架構(之一:Client與Server信息交互處理流程初略介紹)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM