我在远程服务器上有一个单件服务,它有一个方法可以将新对象返回给客户端:
public class MySingleton : MarshalByRefObject
{
public override object InitializeLifetimeService()
{
return null;
}
public MarshalByRefObject GetService()
{
return new Model();
}
}
public class Model : MarshalByRefObject
{
}
我不希望模型实例永远存在于服务器上,因此我只想使用正常的赞助程序,在客户端我为我的模型创建赞助商,并将远程租约附加到此赞助商:
var sponsor = new ClientSponsor();
_service = _mySingleton.GetService();
var success = sponsor.Register(_service);
好吧,这不起作用。远程对象模型会在一段时间后死掉。
你确认这种行为吗?
我想这是因为服务器上的生命周期管理器没有机会初始化租约,因为对象Model是实例化并直接返回。
答案 0 :(得分:0)
我知道这是一篇旧帖子,但在我搜索类似问题时,我偶然发现了这篇文章。
可能它取决于SinkProvider配置。因为服务器上客户端的续订调用需要反序列化。在服务器端的app.exe.config中,您必须设置serverProvider以及clientProvider,如下所示:
<channel ref="tcp" port="50220" useIpAddress="false">
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
<channel ref="http" port="50221" useIpAddress="false">
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="soap" />
</clientProviders>
</channel>
在客户端使用以下app.config.exe:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="0">
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>