gpt4 book ai didi

c# - 在 .NET 远程处理中,RemotingConfiguration.RegisterWellKnownServiceType 和 RemotingServices.Marshal 之间有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 04:53:51 27 4
gpt4 key购买 nike

在 .NET 远程处理中,RemotingConfiguration.RegisterWellKnownServiceType 和 RemotingServices.Marshal 之间有什么区别?

我想做的是在 Windows 服务中创建一个对象,然后将其作为远程对象放入,并让 Windows 服务和客户端都对远程对象进行操作。

我认为下面的代码可以实现这一点。

FooRemoting foo = new FooRemoting();

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

最佳答案

这是我发现的。

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。

关于c# - 在 .NET 远程处理中,RemotingConfiguration.RegisterWellKnownServiceType 和 RemotingServices.Marshal 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com