.Net Remoting 1
时间:2011-02-18 来源:peijihui
二、客户端
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.