用 C# 中更安全的选项替换 MarshalByRefObject
replacing MarshalByRefObject with safer option in C#
我试图在 Whosebug 上找到解决方案,但似乎找不到与我的非常相似的解决方案,所以就到这里吧。我在实验室有一台计算机连接到各种设备,如 pan/tilt 单元、相机和光传感器,并安装了所有驱动程序。我在实验室计算机上有 C# 代码,它知道如何与硬件对话。 C#代码可以设置曝光时间,求一张图片,取回一张,显示在图片框里。我可以告诉 pan/tilt 移动到某个位置并让它在完成后做出响应。如果我在实验室,一切都会按我想要的方式进行。
问题是,当我真的在另一台计算机上时,我想让它感觉像是在实验室的计算机上。最有可能的是,我将 运行 来自 Visual Studio 的非实验室计算机上的代码。实验室中的程序 运行 不会是 Visual Studio 中的 运行。使用远程处理,这是小菜一碟。将与硬件对话的代码放入 class,使用 MarshalByRefObject 以及我创建的接口,添加 RegisterWellKnownServiceType 和 presto 我可以使用 GetObject 获取参考并控制它,就像我坐在实验室的计算机旁一样.所以我知道远程处理会起作用。
但是,WCF 正在逐步淘汰远程处理,更不用说它在现实世界中并不安全。在我看来,WCF 将创建远程对象的本地副本(按值),这意味着它不会在实验室计算机上,因此无法与连接的硬件进行交互。有一天,这台实验室计算机和所有传感器设备都将搬走,我将不得不使用互联网远程访问它。几年前我确实做过这件事,但我使用的是远程处理。由于远程处理非常不安全,我如何在不使用远程处理的情况下做到这一点? WCF 没有与 MarshalByRefObject 等效的东西吗?如果 WCF 仅按值使用,那么他们似乎正在逐步淘汰某些东西而不提供替代它的功能。有没有一种方法可以使用不安全的远程处理?除了 WCF 我还应该使用其他东西吗?
这可能是冗长的,但我看到很多人因为提出不太清楚的问题而感到厌烦,所以我试图弄清楚。如果已经有 post 确实为我的问题提供了最佳答案,我必须首先为自己没有找到它而道歉,但请提供 link 以便我可以在那里得到答案。
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
这几乎完全不正确。没有 "copying" 跨机器完成。事实上,围绕 "remote object" 的整个术语对于 WCF 不再具有太多意义。
没有远程对象,只有一个服务。该服务公开跨越其边界的操作。服务消费者可以调用这些操作。当消费者调用操作时,该调用会传递到服务中,并可能导致服务状态发生变化(例如,与某些硬件设备对话)。
该服务还可以向调用者发送响应,然后可以导致调用者状态发生变化(例如,显示硬件设备的输出)。
为了实现这一点,您首先需要创建一个 service definition. Then you need to host your service on the lab machine. Then you need to 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 及其客户端。
定义服务契约时,您可以指定消费客户端实现 callback contract。这迫使客户端定义一个回调操作,该操作通过服务和客户端之间的通信通道公开,然后服务可以调用该回调以向客户端发送 "push" 信息。
您应该让您的服务使用 WSDualHttpBinding WCF 通道绑定,这将在两个方向上使用端口 80,从而允许它通过 Internet。
我试图在 Whosebug 上找到解决方案,但似乎找不到与我的非常相似的解决方案,所以就到这里吧。我在实验室有一台计算机连接到各种设备,如 pan/tilt 单元、相机和光传感器,并安装了所有驱动程序。我在实验室计算机上有 C# 代码,它知道如何与硬件对话。 C#代码可以设置曝光时间,求一张图片,取回一张,显示在图片框里。我可以告诉 pan/tilt 移动到某个位置并让它在完成后做出响应。如果我在实验室,一切都会按我想要的方式进行。
问题是,当我真的在另一台计算机上时,我想让它感觉像是在实验室的计算机上。最有可能的是,我将 运行 来自 Visual Studio 的非实验室计算机上的代码。实验室中的程序 运行 不会是 Visual Studio 中的 运行。使用远程处理,这是小菜一碟。将与硬件对话的代码放入 class,使用 MarshalByRefObject 以及我创建的接口,添加 RegisterWellKnownServiceType 和 presto 我可以使用 GetObject 获取参考并控制它,就像我坐在实验室的计算机旁一样.所以我知道远程处理会起作用。
但是,WCF 正在逐步淘汰远程处理,更不用说它在现实世界中并不安全。在我看来,WCF 将创建远程对象的本地副本(按值),这意味着它不会在实验室计算机上,因此无法与连接的硬件进行交互。有一天,这台实验室计算机和所有传感器设备都将搬走,我将不得不使用互联网远程访问它。几年前我确实做过这件事,但我使用的是远程处理。由于远程处理非常不安全,我如何在不使用远程处理的情况下做到这一点? WCF 没有与 MarshalByRefObject 等效的东西吗?如果 WCF 仅按值使用,那么他们似乎正在逐步淘汰某些东西而不提供替代它的功能。有没有一种方法可以使用不安全的远程处理?除了 WCF 我还应该使用其他东西吗?
这可能是冗长的,但我看到很多人因为提出不太清楚的问题而感到厌烦,所以我试图弄清楚。如果已经有 post 确实为我的问题提供了最佳答案,我必须首先为自己没有找到它而道歉,但请提供 link 以便我可以在那里得到答案。
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
这几乎完全不正确。没有 "copying" 跨机器完成。事实上,围绕 "remote object" 的整个术语对于 WCF 不再具有太多意义。
没有远程对象,只有一个服务。该服务公开跨越其边界的操作。服务消费者可以调用这些操作。当消费者调用操作时,该调用会传递到服务中,并可能导致服务状态发生变化(例如,与某些硬件设备对话)。
该服务还可以向调用者发送响应,然后可以导致调用者状态发生变化(例如,显示硬件设备的输出)。
为了实现这一点,您首先需要创建一个 service definition. Then you need to host your service on the lab machine. Then you need to 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 及其客户端。
定义服务契约时,您可以指定消费客户端实现 callback contract。这迫使客户端定义一个回调操作,该操作通过服务和客户端之间的通信通道公开,然后服务可以调用该回调以向客户端发送 "push" 信息。
您应该让您的服务使用 WSDualHttpBinding WCF 通道绑定,这将在两个方向上使用端口 80,从而允许它通过 Internet。