1.主要运用在需要跨过应用程序域,与另外的应用程序域进行通信。
2.在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的。首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。
3.Remoting的通道主要有两种:Tcp和Http。TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket 的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供了一种使用 Http协议,使其能在Internet上穿越防火墙传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;如果要穿越防火墙,则使用HttpChannel。
4.远程对象的激活方式
(1)在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。
(2)在Remoting中,远程对象的激活分为两大类:服务器端激活和客户端激活。
(3).Net Remoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。
(1.SingleTon模式:此为有状态模式。类似.net中的Application。
(2. SingleCall模式:SingleCall是一种无状态模式。类似.net中的Session。
(4)SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。
5.远程对象。由于Remoting传递的对象是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject。当远程应用程序引用一个按值封送的对象时,将跨越远程处理边界传递该对象的副本。
6.开发要点:
服务端:
(1)注册通道
(1 TCP通道和HTTP通道
(2 也可以编写自己的通道
//tcp通道注册
TcpChannel tcpChannel = new TcpChannel(8085);
ChannelServices.RegisterChannel(tcpChannel);
//http通道注册
HttpChannel httpChannel = new HttpChannel(8086);
ChannelServices.RegisterChannel(httpChannel);
(2)注册远程对象
RemotingConfiguration.RegisterWellKnownServiceType
(
typeof(RemotingObj),//RemotingObj是自定义的远程对象,在创建的时候需要继承MarshalByRefObject
"test",//uri
WellKnownObjectMode.Singleton//激活模式设置
);
客户端:
//使用TCP通道得到远程对象
TcpChannel tcpChannel = new TcpChannel();
ChannelServices.RegisterChannel(tcpChannel);
RemotingObj obj = (RemotingObj)Activator.GetObject( //RemotingObj是自定义的远程对象
typeof(RemotingObj),
"tcp://localhost:8085/test");
如果使用HTTP通道得到远程对象,将上面的通道修改为Http即可。
这样在客户端就可以使用远程对象Remoting的方法了。
7.为了在开发remoting程序之后便于维护,可将客户端和服务端作为配置文件进行配置
(1)服务端激活
服务端
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode="[Singleton/SingleCall]"
type="[namespace.className], [dllName]"
objectUri="[uri]" />
</service>
<channels>
<channel port="8086" ref="http"/>
</channels>
<!--leaseManagerPollTime="7S"-->
<lifetime
leaseTime="7M"
sponsorshipTimeout="7M"
renewOnCallTime="7M"
/>
</application>
</system.runtime.remoting>
</configuration>
客户端
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="[className], [dllName]" url="http://localhost:8086/url" />
</client>
<channels>
<channel ref="http" port="0"></channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
(2)客户端激活
服务端:
<configuration>
<system.runtime.remoting>
<application>
<service>
<activated type="ClientActivatedType, General"/>
</service>
<channels>
<channel port="8080" ref="http" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端:
<configuration>
<system.runtime.remoting>
<application>
<client url="http://localhost:8080">
<activated type="ClientActivatedType, General"/>
</client>
<channels>
<channel ref="http" port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
注:以上两种激活方式
服务端代码只需要加载配置文件即可:
RemotingConfiguration.Configure(xmlFileName);
客户端代码中只需要如下两部:
第一步:加载配置文件
RemotingConfiguration.Configure(@"xxx.config");
第二步:创建远程对象
RemotingObj obj = new RemotingObj();
8.服务端宿主
(1)Win Form:主要用于p2p开发
(2)Windows服务
(3)iis