.Net Remoting学习

1、服务器端服务程序启动后,建立服务器端通道;这个通道的名称是固定的。
2、任何客户端(包括OCC、接收端),调用服务器端远程对象时,都先建立通道。
   目前的做法是,每个调用都做,都是先建立通道、执行调用、注销通道。也就是说客户端不维持通道。那么就存在客户端同时需要建立两个通道的情况,TcpClientChannel 要求如果要注册多个信道,则每个信道都必须具有唯一的名称,即名称不能重复。
   这是不是就是客户端不停的生成通道名称的原因?

   现在不却确定的是,客户端为什么在应用程序的声明周期内,不维持一个通道?


二、
   一个通道可以建多个远程对象,但是注册时,必须指定不同的URI。如果用同一个URI注册,后面的对象会覆盖前面的对象。例如:
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(AnotherObj), "BroadCastMessage.soap", WellKnownObjectMode.Singleton);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(ThirdObj), "BroadCastMessage.soap", WellKnownObjectMode.Singleton);

    那么客户端通过URI:tcp://localhost:8080/BroadCastMessage.soap,只能得到第二个声明的对象。


三、
   如果客户端出现:Additional information: The channel 'tcp' is already registered.
   只能关闭服务器端通道,才能断开现有的客户端通道。


可以证实以下问题:
1、服务器端同一端口,不能同时注册多个通道。
2、在服务器端同一个通道中,可以声明、注册多个远程对象。但是必须使用不同的URI。
3、客户端进程可以同时注册多个通道,但是必须用不同的通道名称。如果不指定通道名称,则系统自动命名为"http"或"tcp"
   (注意,这里的客户端指客户端进程。不同的进程,可以用同一通道名)
   (可以测试一下,是否在不同线程中,可以用相同名称的通道?)

尚不清楚的问题:
1、关于通道的注销:客户端异常退出,并且没有注销通道,是否影响下次启动。
   在OCC中,新注册一个客户端通道,程序异常退出,没有注销通道。然后下次启动时,提示"tcp"通道已经注册的情况;
   但是在测试程序中,客户端始终不能重现这种情况。
   另外,在客户端不注册通道,直接使用Activator.GetObject获取远程对象时,似乎可以自动注册通道。
 
   网上似乎也有此类通道无法注册的现象:http://www.cnblogs.com/wayfarer/archive/2004/11/02/59577.html
做法是,每次注册新通道前,检查并注销已有通道。

需要注意的问题:
1、采用remoting事件注册机制时,客户端通道必须采用TcpChannel的方式。因为要提高序列化级别。
   http://www.cnblogs.com/wayfarer/archive/2005/03/15/74587.html


余留问题:

1、采用事件注册的方留式,客户端注册服务器端事件,并且客户端维持一个常链接通道。如果服务器端服务重启,如何让客户端重现注册事件?

关于OCC偶尔报异常:ex = {"The channel 'tcp' is already registered."}

1、 经测试程序验证,在默认情况下,即时不主动注册通道,而直接使用Activator.GetObject去获取远程对象,系统会默认注册一个TcpClientChannel的通道,通道名称为"tcp";
   在多线程情况下,跟踪当前应用程序的所有通道,发现也始终只有一个名称为"tcp"的通道。

   但是如果使用事件机制的话,由于安全级别的限制,必须使用TcpChannel,那么这时候,必须自己手动注册通道。

2、在OCC报异常"The channel 'tcp' is already registered."的时候,在GetObject之前、之后进行更正,发现没有"tcp"名称的通道存在。所以不清楚程序为什么会做出这样的提示。

   但是跟踪当前已有的TcpChannel通道,发现TcpChannel中有两个成员_serverChannel和_clientChannel,它们的名称都是"tcp"。

3、鉴于情况2,发现本机的服务器端通道是默认名称,也就是说服务器端通道名称也是"tcp",怀疑是与服务器端通道冲突。将服务器端通道设定名称后,好像异常不再出现。

posted @ 2011-04-20 09:51  pjh123  阅读(414)  评论(0编辑  收藏  举报