zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    P1440 求m区间内的最小值
    P1569 Generic Cow Protests
    P3252 [JLOI2012]树
    P3009 [USACO11JAN]Profits S
    <二分查找+双指针+前缀和>解决子数组和排序后的区间和
    常见算法技巧之——双指针思想
    设计模式——单例模式
    操作系统实验——读者写者模型(写优先)
    操作系统——内存管理学习笔记
    Altium Designer 16下载与安装教程
  • 原文地址:https://www.cnblogs.com/tyb1222/p/2423395.html
Copyright © 2011-2022 走看看