在.NET远程处理中,RemotingConfiguration.RegisterWellKnownServiceType和RemotingServices.Marshal有什么不同?
我想要做的是在Windows服务中创建一个对象,然后将其作为远程处理对象放入,并让Windows服务和客户端都作用于该远程处理对象。
我认为下面的代码可以做到这一点。
FooRemoting foo = new FooRemoting();
RemotingConfiguration.RegisterWellKnownServiceType(typeof(FooRemoting), serverName, WellKnownObjectMode.Singleton);
RemotingServices.Marshal(foo);
发布于 2009-01-29 21:49:27
这就是我发现的。
RemotingConfiguration.RegisterWellKnownServiceType(typeof(FooRemoting),
serverName, WellKnownObjectMode.Singleton);
RegisterWellKnownServiceType将创建该对象,并使其成为任何使用该对象的客户端的单例,但不会创建服务器的引用。该对象直到客户端请求它时才被创建,并且相同的对象被用于任何其他客户端。
RemotingServices.Marshal(foo);
Marshal将注册服务器创建的对象,在本例中为windows服务。然后,服务器将拥有对对象的引用,而客户端将使用相同的对象。
我的问题是使用Marshal注册远程处理对象。随着时间的推移,远程处理对象将消失,供客户端使用,即不再位于远程处理对象上。该服务仍将保留其引用。然后我尝试了RegisterWellKnownServiceType,客户端一直在获取正确的引用,但是我无法让服务拥有对同一对象的引用。
解决方案是覆盖远程处理对象,在本例中为FooRemoting。如果我重写InitializeLifetimeService并返回null,客户端将永远不会丢失连接,而服务将保持连接。
public override object InitializeLifetimeService()
{
//return base.InitializeLifetimeService();
return null;
}
为了保留服务创建的对象并让客户端使用相同的对象,您必须使用
RemotingServices.Marshal(foo);
并重写InitializeLifetimeService以返回null。
https://stackoverflow.com/questions/493455
复制相似问题