服务器端 1)注册通道 2)注册远程对象 3)注销通道
【3】服务器端
根据第一部分所述,根据激活模式的不同,通道类型的不同服务器端的实现方式也有所
不同。大体上说,服务器端应分为三步:
1)注册通道
要跨越应用程序域进行通信,必须实现通道。如前所述,Remoting 提供了IChannel 接
口,分别包含TcpChannel 和HttpChannel 两种类型的通道。这两种类型除了性能和序列化数
据的格式不同外,实现的方式完全一致,因此下面我们就以TcpChannel 为例。
注册 TcpChannel,首先要在项目中添加引用“System.Runtime.Remoting”,然后using
名字空间:System.Runtime.Remoting.Channel.Tcp。代码如下:
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
在实例化通道对象时,将端口号作为参数传递。然后再调用静态方法 RegisterChannel()来注
册该通道对象即可。
2)注册远程对象
注册了通道后,要能激活远程对象,必须在通道中注册该对象。根据激活模式的不同,
注册对象的方法也不同。
(1) SingleTon 模式
对于 WellKnown 对象,可以通过静态方法
RemotingConfiguration.RegisterWellKnownServiceType()来实现:
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ServerRemoteObject.ServerObject),
"ServiceMessage",WellKnownObjectMode.SingleTon);
(2)SingleCall 模式
注 册 对 象 的方法基本上和SingleTon 模式相同, 只需要将枚举参数
WellKnownObjectMode 改为SingleCall 就可以了。
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ServerRemoteObject.ServerObject),
"ServiceMessage",WellKnownObjectMode.SingleCall);
(3)客户端激活模式
对于客户端激活模式,使用的方法又有不同,但区别不大,看了代码就一目了然。
RemotingConfiguration.ApplicationName = "ServiceMessage";
RemotingConfiguration.RegisterActivatedServiceType(
typeof(ServerRemoteObject.ServerObject));
为什么要在注册对象方法前设置 ApplicationName 属性呢?其实这个属性就是该对象的
URI。对于WellKnown 模式,URI 是放在RegisterWellKnownServiceType()方法的参数中,当
然也可以拿出来专门对ApplicationName 属性赋值。而RegisterActivatedServiceType()方法的
重载中,没有ApplicationName 的参数,所以必须分开。
3)注销通道
如果要关闭 Remoting 的服务,则需要注销通道,也可以关闭对通道的监听。在Remoting
中当我们注册通道的时候,就自动开启了通道的监听。而如果关闭了对通道的监听,则该通
道就无法接受客户端的请求,但通道仍然存在,如果你想再一次注册该通道,会抛出异常。

浙公网安备 33010602011771号