初探.Net Remoting服务端 Loading Remtoing配置内容的过程 (转载)
2006-04-04 10:30
387 查看
初探.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>来初始化Server的Remoting运行期架构体系。
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》下载。
做了不少的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>来初始化Server的Remoting运行期架构体系。
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》下载。
相关文章推荐
- 初探.Net Remoting客户端 Loading Remtoing配置内容的过程 (转载)
- 初探.Net Remoting客户端 Loading Remtoing配置内容的过程
- 初探.Net Remoting客户端 Loading Remtoing配置内容的过程
- 初探.Net Remoting服务端 Loading Remtoing配置内容的过程
- 初探.Net Remoting服务端 Loading Remtoing配置内容的过程
- Centos下使用gitosis配置管理git服务端(转载)
- Hadoop安装教程_单机/伪分布式配置_Hadoop2.7.2/Ubuntu14.04(转载,修改部分内容)
- OGG "Loading data from file to Replicat"table数据的静态同步配置过程
- 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)
- Windows下WebStorm配置使用SVN详细过程(客户端和服务端完整版)
- fpga配置过程(转载)
- SpringCloud(第 032 篇)配置服务端ClientServer对配置文件内容进行RSA加解密
- 多处转载综合:UBoot配置过程(顶层Makefile)
- 游戏服务端pomelo完整安装配置过程
- 转载 - Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)
- 游戏服务端pomelo完整安装配置过程
- 全新S2SH配置一步一步过程详解 转载请注明
- 【转载】app测试的过程和重点关注内容
- linux挂载文件系统过程-转载内容与自己的一些理解
- SpringCloud(第 030 篇)配置服务端ClientServer对配置文件内容进行对称加解密