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);
}
posted @ 2012-03-29 14:49  tyb1222  阅读(3522)  评论(0编辑  收藏  举报