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

Dav*_*e B 5 c# wcf .net-remoting

我试图在stackoverflow找到一个解决方案,但似乎找不到一个像我这样的解决方案,所以在这里.我在实验室里有一台计算机连接到各种设备,如摇摄/倾斜装置,摄像头和光传感器,并安装了所有驱动程序.我在实验室计算机上有C#代码,知道如何与硬件通信.C#代码可以设置曝光时间,要求图片,后退,并将其显示在图片框中.我可以告诉平移/倾斜移动到某个位置并在完成后让它响应.如果我在实验室,这一切都按照我想要的方式工作.

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

然而,WCF正在逐步淘汰远程服务,更不用说它在现实世界中并不是真正的安全了.在我看来,WCF将创建远程对象的本地副本(按值),这意味着它不会在实验室计算机上,因此无法与附加的硬件进行交互.有一天,这台实验室计算机和所有传感器设备将被移走,我将不得不使用互联网远程访问它.几年前我做了这件事,但我正在使用远程处理.由于远程处理是如此不安全,如何在不使用远程处理的情况下执行此操作?WCF没有与MarshalByRefObject等效的东西吗?如果WCF仅按值使用,那么看起来它们正在逐步取消某些内容而不提供替换它的功能.有没有办法使用不安全的远程处理?除了WCF我还应该使用其他东西吗?

这可能是漫长的啰嗦,但我看到很多人因为提出不太清楚的问题而感到害怕,所以我试图说清楚.如果已经有一篇文章真正为我提供了我的问题的最佳答案,我必须首先道歉,因为我自己找不到,但要求提供一个链接,以便我可以在那里得到答案.

tom*_*ern 7

在我看来,WCF将创建远程对象的本地副本(按值),这意味着它不会在实验室计算机上,因此无法与附加的硬件进行交互

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

没有远程对象,只是一个服务.该服务在其边界上公开操作.服务消费者可以调用这些操作.当消费者调用操作时,该调用将进入服务并可能导致服务状态发生变化(例如,与某些硬件设备通信).

该服务还可以向呼叫者发送响应,然后该响应可以使呼叫者状态改变(例如,显示来自硬件设备的输出).

为了实现这一点,首先需要创建服务定义.然后,您需要在实验室机器上托管您的服务.然后,您需要创建一个服务客户端,然后您可以在本地计算机上使用该客户端来调用服务操作.

(如何)处理连接到实验室计算机上的硬件的端口触发需要由我的应用程序拾取的DataReceived事件的情况

这是一个更复杂的要求,但是,WCF支持与其客户端进行双工通信.

在定义服务合同时,您可以指定使用客户端实现回调合同.这会强制客户端定义一个回调操作,该操作通过服务和客户端之间的通信通道公开,然后服务可以调用该信息将"推送"信息发送给客户端.

您应该让您的服务使用WSDualHttpBinding WCF通道绑定,它将在两个方向上使用端口80,允许它通过互联网.