我刚刚在 MSDN 网站 (http://msdn.microsoft.com/en-us/library/aa730857(v=vs.80).aspx) 上阅读了 Ingo Rammer 的文章,标题为“从 .NET Remoting 到 Windows Communication Foundation (WCF)”。
不过我还有一个疑惑,希望有人能帮帮我。
在“第 3 步 - 使用 session 而不是客户端激活的对象”这节课中,它完全涵盖了我们在公司中使用远程处理的类型,他展示了如何获取和使用对实例化的远程对象的引用另一端(服务器端)。然而,在我们的例子中,当客户端请求引用它们时,我们不会在服务器端实例化这些对象。这些对象已经存在于服务器端(它们之前已实例化),我只想获取对这些已经激活的对象的引用。
我们今天如何使用 Remoting 来做到这一点?我们有一个“对象服务器”对象(派生自 MarshalByRefObject)。该对象可通过 URL“tcp://localhost:9002/ObjectServerInstance”获得。远程应用程序可以使用 Activator.GetObject 获取对它的引用。此对象服务器对象实现一个接口(interface) IObjectServer,它声明一个具有以下签名的方法: Object GetObject (string objTag);
客户端应用程序使用对此对象服务器对象的引用来调用其 GetObject 方法,将对象标记字符串作为参数(例如:“Portfolio”)传递。然后此方法返回对 Portfolio 对象的引用,该对象先前已使用此标记“Portfolio”在对象服务器对象之前发布了自己。当然,Portfolio 对象也派生自 MarshalByRefObject。而且它不是仅在远程客户端请求引用它时才实例化,它已经在服务器上实例化了。
当然,这可以用不同的方式来完成。每个可能被远程访问的对象都可以通过编程方式使用自己的 objectUri 在服务器端的 Remoting 层之前发布自己(例如:“tcp://localhost:9002/MyObjectInstance”),而在客户端我们可以使用 Activator .GetObject 直接获取每个对象的引用。但这与我提出的观点无关。不管怎样,当服务器对象在远程处理层之前发布它们自己时,它们就已经存在了。
我说得够清楚了吗?您是否看到使用 WCF 执行此操作的方法?
最佳答案
查看您提供的链接中的代码,在我看来您需要修改 IRemoteFactory
接口(interface)的 GetInstanceMethod
实现以返回一个现有的对象, 而不是创建一个新对象。
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;
}
}
关于c# - 如何使用 WCF 获取对已实例化的远程对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961031/