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