现在的位置: 首页 > 综合 > 正文

Remoting多服务器的类型重定向问题

2012年08月01日 ⁄ 综合 ⁄ 共 995字 ⁄ 字号 评论关闭

写在前面:在.Net中使用Remoting来实现远程连接,如果要在多服务器切换远程服务的对象,常常会出现这样的错误:试图重定向类型"****"的激活,而该类型已被重定向,英文错误信息为Attempt to redirect activation of type '****' which is already redirected。下面就这个错误进行讨论。

异常信息
System.Runtime.Remoting.RemotingException
****所代表的是类型,如MyServiceComponent.MyComponent, MyServiceComponent。

发生的原因
这一错误发生的原因,一般是多服务器所致的。在CAO(客户端激活)模式下,假设有服务器A,B,客户端连接A之后,与A建立信道,远程对象被创建,如果客户端与B连接,就要先将当前的远程对象关闭和信道关闭,不过,通常情况下,就算使用ChannelServices.UnregisterChannel方式,这个问题也没有解决。

众所周知,在客户端激下,远程对象的生命周期是由客户端所控制的,举个简单的例子就是对象new之后,就已经创建了连接。那么我们可以发现这样一个逻辑问题:可以猜到,new之后信道就已经被使用,而且信道只可以有一个,如果有多个信道,那就根据不知道连接的是什么信道。这样在切换多服务器时,就一定要完全清理当前使用中的信道。

一个肯定可以解决此问题的方法
在CAO模式下,有一定的困难,因为清理信道不是用户可以控制的。不过如果使用SingleTon模式,问题就很好解决了。因为使用Activator.GetObject方法,可以很自由地控制远程对象,而自身的信道是可以不改变的。只要服务器A,B提供的服务一样,实现多服务器的自动切换没什么难度。
使用服务器A
Activator.GetObject(typeof(MyServiceComponent.MyComponent), "http://serverA/remotObj")
与使用服务器B
Activator.GetObject(typeof(MyServiceComponent.MyComponent), "http://serverB/remotObj")
基础上没有什么差别。
实践证明,这种方法是最灵活的,而使用配置文件的方式只会令你更加的麻烦。


出处:小作坊网Chakman

抱歉!评论已关闭.