c# - 用 C# 中更安全的选项替换 MarshalByRefObject

标签 c# wcf .net-remoting

我试图在 stackoverflow 上找到一个解决方案,但似乎找不到一个与我的非常相似的解决方案,所以就到这里吧。我在实验室有一台计算机连接到各种设备,如平移/倾斜装置、相机和光传感器,并安装了所有驱动程序。我在实验室计算机上有 C# 代码,它知道如何与硬件对话。 C#代码可以设置曝光时间,求一张图片,取回一张,显示在图片框里。我可以告诉平移/俯仰移动到某个位置并让它在完成后做出响应。如果我在实验室,一切都会按照我想要的方式进行。

问题是,当我真的在另一台电脑前时,我想让它感觉像是在实验室的电脑前。最有可能的是,我将从 Visual Studio 内部运行非实验室计算机上的代码。在实验室中运行的程序不会从 Visual Studio 中运行。使用远程处理,这是小菜一碟。将与硬件对话的代码放入一个类中,使用 MarshalByRefObject 以及我创建的接口(interface),添加 RegisterWellKnownServiceType 并立即使用 GetObject 获取引用并控制它,就像我坐在实验室的计算机旁一样。所以我知道远程处理会起作用。

但是,WCF 正在逐步淘汰远程处理,更不用说它在现实世界中并不安全。在我看来,WCF 将创建远程对象的本地副本(按值),这意味着它不会在实验室计算机上,因此无法与连接的硬件进行交互。有一天,这台实验室计算机和所有传感器设备都将搬走,我将不得不使用互联网远程访问它。几年前我确实做过这件事,但我使用的是远程处理。由于远程处理非常不安全,我如何在不使用远程处理的情况下做到这一点? WCF 没有与 MarshalByRefObject 等效的东西吗?如果 WCF 仅按值使用,那么他们似乎正在逐步淘汰某些东西而不提供替代它的功能。有没有一种方法可以使用不安全的远程处理?除了 WCF,我还应该使用其他东西吗?

这可能是冗长的,但我看到很多人因为提出不是很清楚的问题而感到厌烦,所以我试图弄清楚。如果已经有一篇帖子真正为我的问题提供了最佳答案,我必须首先为自己没有找到它而道歉,但请提供一个链接,以便我可以在那里得到答案。

最佳答案

It appears to me that WCF is going to make a local copy (by value) of the remote object which means it will not be on the lab computer and therefore unable to interact with the hardware that is attached

这几乎是完全错误的。没有跨机器进行“复制”。事实上,围绕“远程对象”的整个术语对于 WCF 不再具有太多意义。

没有远程对象,只有一个服务。该服务公开跨越其边界的操作。服务消费者可以调用这些操作。当消费者调用操作时,该调用会传递到服务中,并可能导致服务状态发生变化(例如,与某些硬件设备对话)。

该服务还可以向调用者发送响应,然后可以导致调用者状态发生变化(例如,显示硬件设备的输出)。

为了实现这一点,您首先需要创建一个 service definition .然后你需要host your service在实验室机器上。然后你需要create a service client ,然后您可以在本地计算机上使用它来调用服务操作。

(How to) handle the situation where the port connected to the hardware on the lab computer fires a DataReceived event that needs to be picked up by my application

这是一个更复杂的要求,但是是的,WCF 支持 duplex communications与它的客户。

定义服务契约(Contract)时,您可以指定消费客户端实现 callback contract .这迫使客户端定义一个回调操作,该操作通过服务和客户端之间的通信 channel 公开,然后服务可以调用该操作以将信息“推送”给客户端。

您应该让您的服务使用 WSDualHttpBinding WCF channel 绑定(bind),这将在两个方向上使用端口 80,从而允许它通过 Internet。

关于c# - 用 C# 中更安全的选项替换 MarshalByRefObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804263/

相关文章:

c# - Delphi dll函数转C#

c# - 以最大并发度运行多个操作 - 最后 2 个任务未执行

c# - 构建失败。检查“输出”窗口以获取更多详细信息 - C# 发布失败但构建成功

c# - 有条件地允许在 FormView 中进行编辑吗?

c# - .Net 远程处理错误 "Requested Service not found"

c# - 需要 WCF MessageBodyMember

wcf - 温莎城堡 WcfFacility 错误。忘记注册组件?

用于视频播放的 WCF REST Streaming

.net - 主互操作程序集 (PIA)

c# - 我可以用 throw 移除空捕获吗?