zoukankan      html  css  js  c++  java
  • 初探.Net Remoting服务端 Loading Remtoing配置内容的过程 (转载)

    初探.Net Remoting服务端 Loading Remtoing配置内容的过程

    做了不少的Remtoing版的Project,对Remoting在Loading Remoting配置内容的过程中到底做了什么,一直没有一个清晰的在内逻辑认识,今天心血来潮,investigate一番,于是就有了这篇Post,以供大家赏析,另外也对那些希望新建自己的ServerSink有些一些帮助: 

    Remoting Server Initialize process,一般如以下步骤所示:

    1.      一般服务端程序会以:System.Runtime.Remoting.RemotingConfiguration.Configure”server.exe.config”),开始Loading 的第一步,该函数会根据配置文件内容初始化Server端的Remoting运行期架构体系。

    2.      在上面的Configure”server.exe.config”调用
    System.Runtime.Remoting.RemotingConfigHandler.ConfigureRemoting()
    ,该函数根据”server.exe.config”的以下配置内容为例
    <
    system.runtime.remoting>

        <application>

          <channels>

            <channel ref="http" port="5555">

                <serverProviders>  

                    <provider type="MyServerSink.MyServerSinkProvider, MyServerSink"/>

                    <formatter ref="soap"/>

                </serverProviders>

            </channel>

          </channels>     
        </
    application>
        </
    system.runtime.remoting>
    初始化ServerRemoting运行期架构体系。

    3.      在上面的ConfigureRemoting()中,会调用System.Runtime.Remoting.RemotingConfigHandler.CreateServerChannelSinkProviderChain(ArrayList entries),该函数根据以下配置内容为例:
    <serverProviders> (注意:这里的配置顺序和“Client配置顺序恰好相反)
        <provider type="MyServerSink.MyServerSinkProvider, MyServerSink"/>
        <
    formatter ref="soap"/>
    </
    serverProviders>
    创建ServerSinkProviderChain链表按照该配置顺序,先创建MyServerSink.MyServerSinkProvider对象,再创建SoapServerFormatterSinkProvider对象,然后把SoapServerFormatterSinkProvider对象,赋值给MyServerSinkProvider1对象的Next属性(在后面,通过该属性可以递归创建ServerChannelSinkChain链表)(这是个递归创建的过程,下一个被创建的对象赋值给上一个被创建对象的Next属性)

    4.      在上面的ConfigureRemoting()中,会根据<channel ref="http" port="5555">,创建ServerChannel通道:构造HttpChannel对象在构造HttpChannel对象过程中,会构造HttpServerChannel对象其实HttpServerChannel才是真正起作用的的对象(IChannelReceiver),以"5555"作为侦听端口

    5.      HttpServerChannel对象的SetupChannel()中,调用CreateServerChannelSinkChain()过程中,以创建ServerChannelSinkChain链表。

    6.      在上面的CreateServerChannelSinkChain()过程中,会遍历前面所创建 ServerSinkProviderChain链表,按照逆向顺序,通过SoapServerFormatterSinkProvider对象的CreateSink(),调用SoapServerFormatterSink构造函数,返回一个SoapServerFormatterSink对象,再通过MyServerSinkProvider对象的CreateSink(),调用MyServerSink构造函数,返回一个MyServerSink对象,并把SoapServerFormatterSink对象赋值给MyServerSink对象的Next属性,从而建立起ServerSinkProviderChain链表。其实这个过程用代码来表达是非常简单的(_nextProvider起到关键作用)

        // create sinks of the next SinkProvider in the chain

        IServerChannelSink next = _nextProvider.CreateSink(channel);   
       
    return new MyServerSink(next);

     

    下图是以一下配置文件,初始化后的架构图:初探.Net Remoting服务端 Loading Remtoing配置内容的过程

    <serverProviders>   (注意:这里的配置顺序和“Client配置顺序恰好相反)

            <provider type="MyServerSink1.MyServerSinkProvider1, MyServerSink1"/>(Client端的MyClientSink1对应)

            <formatter ref="soap"/>

            <provider type="MyServerSink2.MyServerSinkProvider2, MyServerSink2"/>(Client端的MyClientSink2对应)

    </serverProviders>



    初探.Net Remoting客户端 Loading Remtoing配置内容的过程 》已经推出。
    也许我上面说了一大堆,还不如大家看一下具体的源代码来得清楚。以文章中的实例代码,请从《实现一个压缩Remoting传输数据的Sink:CompressionSink》下载。

  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/daitengfei/p/366331.html
Copyright © 2011-2022 走看看