赞助远程实例化对象

时间:2012-07-11 11:12:08

标签: .net-remoting

我在远程服务器上有一个单件服务,它有一个方法可以将新对象返回给客户端:

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是实例化并直接返回。

1 个答案:

答案 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>