如何使用WCF获取对已经实例化的远程对象的引用?

时间:2013-11-13 17:59:11

标签: c# wcf migration remoting

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

但是,我仍然有一个疑问,我希望有人可以帮助我。

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

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

客户端应用程序使用对此Object Server对象的引用来调用其GetObject方法,并将对象标记字符串作为参数传递(例如:“Portfolio”)。然后,此方法返回对Portfolio对象的引用,该对象先前已使用此标记“Portfolio”在Object Server对象之前发布。当然,Portfolio对象也来自MarshalByRefObject。并且只有在远程客户端请求引用它时才会实例化它,它已在服务器上实例化。

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

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

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:0)

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

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

对于Stack Overflow帖子,解决方案有点太长了,所以我将它发布在github here上。

我不能对这个解决方案说任何功劳 - 大部分内容来自我在某处读过的博客文章(我会记得它会更新这个)。从它的角度来看它很有意思,它使用了一些相当先进的WCF低级代码 - 它非常适合进一步理解WCF的工作原理。

如果无论如何都要避免在生产环境中实现这一点,那么我会进一步重复这一点。