【发布时间】:2013-11-13 17:59:10
【问题描述】:
我刚刚在 MSDN 网站 (http://msdn.microsoft.com/en-us/library/aa730857(v=vs.80).aspx) 上阅读了 Ingo Rammer 题为“从 .NET Remoting 到 Windows Communication Foundation (WCF)”的文章。
不过,我仍然有一个疑问,希望有人能帮助我。
在会话“第 3 步 - 使用会话而不是客户端激活的对象”中,它准确地涵盖了我们在公司中使用远程处理的类型,他展示了如何获取和使用对在另一端(服务器端)。然而,在我们的例子中,当客户端请求对它们的引用时,我们不会在服务器端实例化这些对象。服务器端已经存在对象(它们之前已实例化),我只想获取对这些已激活对象的引用。
我们今天如何使用远程处理来做到这一点?我们有一个“对象服务器”对象(派生自 MarshalByRefObject)。该对象可通过 URL “tcp://localhost:9002/ObjectServerInstance”获得。远程应用程序可以使用 Activator.GetObject 获取对它的引用。此对象服务器对象实现了一个接口 IObjectServer,该接口声明了一个具有以下签名的方法: 对象GetObject(字符串objTag);
客户端应用程序使用对这个对象服务器对象的引用来调用它的 GetObject 方法,传递一个对象标签字符串作为参数(例如:“组合”)。然后,此方法返回对 Portfolio 对象的引用,该对象先前已使用此标记“Portfolio”在对象服务器对象之前发布自身。 Portfolio 对象当然也派生自 MarshalByRefObject。而且它不是仅在远程客户端请求对其进行引用时才实例化的,它已经在服务器上实例化了。
当然,这可以采取不同的方式。每个可以远程访问的对象都可以通过编程方式使用自己的 objectUri 在服务器端的 Remoting 层之前发布自己(例如:“tcp://localhost:9002/MyObjectInstance”),在客户端我们可以使用 Activator .GetObject 直接获取每个对象的引用。但这与我提出的观点无关。无论如何,当服务器对象在 Remoting 层之前发布时,它们就已经存在了。
我说得够清楚吗?您是否看到了使用 WCF 执行此操作的方法?
【问题讨论】:
-
服务器端的对象不仅仅在客户端使用。服务器是一个已经在运行的应用程序。服务器上的相同对象可以而且必须被多个客户端访问。例如:我在服务器端反对安全 MSFT(Microsoft)的订单管理器。每个想要为 MSFT 证券发送订单的客户都必须将请求发送给这个订单管理器,在执行一些内部代码之后,这个订单管理器然后将请求的订单发送到适当的交易所(例如:NYSE 或 NASDAQ)。
-
我无法控制客户端应用何时请求对这些订单管理器对象的引用。唯一的要求是服务器应用程序必须启动,并且当第一个客户端请求引用以发送订单时,必须实例化订单管理器对象。并且所有想要发送 SAME 安全命令的客户端,例如 MSFT,都将在服务器端访问 SAME 对象。