2

我刚刚在 MSDN 网站 ( http://msdn.microsoft.com/en-us/library/aa730857(v=vs ) 上阅读了 Ingo Rammer 的文章“从 .NET Remoting 到 Windows Communication Foundation (WCF)” .80).aspx )。

不过,我仍然有一个疑问,我希望有人能帮助我。

在会话“第 3 步 - 使用会话而不是客户端激活的对象”中,它准确地涵盖了我们在公司中使用的远程处理,他展示了如何获取和使用对另一端实例化的远程对象的引用(服务器端)。但是,在我们的例子中,当客户端请求对它们的引用时,我们不会在服务器端实例化这些对象。对象已经存在于服务器端(它们之前已实例化),我只想获取对这些已经活动对象的引用。

我们今天如何使用远程处理来做到这一点?我们有一个“对象服务器”对象(派生自 MarshalByRefObject)。该对象可通过 URL “tcp://localhost:9002/ObjectServerInstance”获得。远程应用程序可以使用 Activator.GetObject 获取对它的引用。此对象服务器对象实现了一个接口 IObjectServer,它声明了一个具有以下签名的方法: Object GetObject (string objTag);

客户端应用程序使用对这个对象服务器对象的引用来调用它的 GetObject 方法,传递一个对象标记字符串作为参数(例如:“组合”)。然后,此方法返回对 Portfolio 对象的引用,该对象先前已使用此标签“Portfolio”在对象服务器对象之前发布自身。Portfolio 对象当然也派生自 MarshalByRefObject。并且它不是仅在远程客户端请求对其进行引用时才实例化的,它已经在服务器上实例化了。

当然,这可以做不同的事情。每个可以远程访问的对象都可以通过编程方式使用自己的 objectUri 在服务器端的 Remoting 层之前发布自己(例如:“tcp://localhost:9002/MyObjectInstance”),在客户端我们可以使用 Activator .GetObject 直接获取每个对象的引用。但这与我提出的观点无关。无论如何,当服务器对象在 Remoting 层之前发布它们自己时,它们就已经存在了。

我够清楚了吗?您是否看到使用 WCF 执行此操作的方法?

4

2 回答 2

0

您的问题有一个解决方案,但请注意它违背了 WCF 的纹理和面向服务的概念。

在服务器上维护会话状态会产生各种后果和潜在的陷阱。您引入了客户端和服务器之间的耦合,并且必须仔细考虑在损坏状态和异常的情况下您将做什么。

该解决方案对于 Stack Overflow 帖子来说有点太长了,所以我在 github 上发布了

我不能为这个解决方案声称任何功劳——其中大部分来自我在某处读过的一篇博客文章(一旦我记得它是什么,我会更新它)。有趣的是,它使用了一些相当高级的 WCF 低级代码 - 它非常有助于加深您对 WCF 工作原理的理解。

我会进一步重申,如果无论如何要避免在生产环境中实现这一点,就可以沿着这条路线走下去。

于 2013-11-15T14:41:29.873 回答
0

查看您提供的链接中的代码,在我看来,您需要修改接口的GetInstanceMethod实现以返回现有对象,而不是创建新对象。IRemoteFactory

public interface IRemoteFactory
{
  IMySessionBoundObject GetInstance();
}

public class RemoteFactory : MarshalByRefObject, IRemoteFactory
{
  public IMySessionBoundObject GetInstance()
  {
    // Return an already existing object, instead of a new one.
    return MyAlreadyExistingSessionBoundObject;
  }
}
于 2013-11-13T18:06:12.107 回答