首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在.NET远程处理中,RemotingConfiguration.RegisterWellKnownServiceType和RemotingServices.Marshal有什么不同?

在.NET远程处理中,RemotingConfiguration.RegisterWellKnownServiceType和RemotingServices.Marshal有什么不同?
EN

Stack Overflow用户
提问于 2009-01-29 21:13:55
回答 1查看 15.3K关注 0票数 19

在.NET远程处理中,RemotingConfiguration.RegisterWellKnownServiceType和RemotingServices.Marshal有什么不同?

我想要做的是在Windows服务中创建一个对象,然后将其作为远程处理对象放入,并让Windows服务和客户端都作用于该远程处理对象。

我认为下面的代码可以做到这一点。

代码语言:javascript
复制
FooRemoting foo = new FooRemoting();

RemotingConfiguration.RegisterWellKnownServiceType(typeof(FooRemoting), serverName, WellKnownObjectMode.Singleton);
RemotingServices.Marshal(foo);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-01-29 21:49:27

这就是我发现的。

代码语言:javascript
复制
RemotingConfiguration.RegisterWellKnownServiceType(typeof(FooRemoting), 
          serverName, WellKnownObjectMode.Singleton);

RegisterWellKnownServiceType将创建该对象,并使其成为任何使用该对象的客户端的单例,但不会创建服务器的引用。该对象直到客户端请求它时才被创建,并且相同的对象被用于任何其他客户端。

代码语言:javascript
复制
RemotingServices.Marshal(foo);

Marshal将注册服务器创建的对象,在本例中为windows服务。然后,服务器将拥有对对象的引用,而客户端将使用相同的对象。

我的问题是使用Marshal注册远程处理对象。随着时间的推移,远程处理对象将消失,供客户端使用,即不再位于远程处理对象上。该服务仍将保留其引用。然后我尝试了RegisterWellKnownServiceType,客户端一直在获取正确的引用,但是我无法让服务拥有对同一对象的引用。

解决方案是覆盖远程处理对象,在本例中为FooRemoting。如果我重写InitializeLifetimeService并返回null,客户端将永远不会丢失连接,而服务将保持连接。

代码语言:javascript
复制
public override object InitializeLifetimeService()
{
    //return base.InitializeLifetimeService();
    return null;
}

为了保留服务创建的对象并让客户端使用相同的对象,您必须使用

代码语言:javascript
复制
RemotingServices.Marshal(foo);

并重写InitializeLifetimeService以返回null。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/493455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档