.Net Remoting 1

以下写的并不是通道的基础知识,而是一些思考,并且需要经过实际程序验证。
一、服务器端
1、服务器端通道必须是TcpChannel或者TcpServerChannel这两种类对象。
2、服务器端同一端口,不能同时注册多个通道;
3、一个通道可以建多个远程对象,但是注册时,必须指定不同的URI。如果用同一个URI注册,后面的对象会覆盖前面的对象。例如:
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(AnotherObj), "BroadCastMessage.soap", WellKnownObjectMode.Singleton);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(ThirdObj), "BroadCastMessage.soap", WellKnownObjectMode.Singleton);
    那么客户端通过URI:tcp://localhost:8080/BroadCastMessage.soap,只能得到第二个声明的对象。
    注:这个很好理解,就像在一个管道里面有两个对象但却只有一个URI,客户端不知道到底要用哪个,

二、客户端
1、
   客户端进程可以同时注册多个通道,但是必须用不同的通道名称。如果不指定通道名称,则系统自动命名为"http"或"tcp"
   (注意,这里是进程级别的。假如一个PC上,运行两个客户端,分别注册一个通道,名称一致也无妨)
2、
   在默认情况下,即使不主动注册通道,而直接使用Activator.GetObject去获取远程对象,系统会默认注册一个TcpClientChannel的通道,通道名称为"tcp";
   在多线程情况下,每个线程都去Activator.GetObject一个远程对象,跟踪当前应用程序的所有通道,发现也始终只有一个名称为"tcp"的通道
   注:理论上,我们在客户端可以不注册通道,而使用默认的通道。但有例外,如下3

3、但是如果使用事件机制的话,由于安全级别的限制,客户端必须使用TcpChannel,那么这时候,必须自己手动注册通道。
   原因如下:
在VS2003中,将序列化的安全级别提高了。所以,在注册通道时,应该将TypeFilterLevel设置为Full;
具体方法,在服务端注册通道的代码:
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["port"] = 0;

HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider);
ChannelServices.RegisterChannel(channel);

另外在项目中记得加上命名空间的引用:
using System.Runtime.Serialization.Formatters;
否则无法识别TypeFilterLevel.

 

posted @ 2011-02-18 17:39  pjh123  阅读(179)  评论(0编辑  收藏  举报