Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在internet上实现发布/订阅通信_C#_.net_Wcf_Web Services_Publish Subscribe - Fatal编程技术网

C# 如何在internet上实现发布/订阅通信

C# 如何在internet上实现发布/订阅通信,c#,.net,wcf,web-services,publish-subscribe,C#,.net,Wcf,Web Services,Publish Subscribe,我有一个托管在服务器上的.Net服务,以及通过internet连接到此服务器的.Net客户端 我想实现一个发布-订阅模型,其中客户端可以订阅服务上的事件,并在数据可用时将数据推送到它们。另一种方法是让客户机轮询服务器以获取数据,但是这可能太慢,无法满足需要。因此需要发布/订阅类型的通信 我知道WCF绑定WSDualHttpBinding确实允许这样做,但是它有一个缺点。根据“WCF服务编程”作者Juval Lowy的说法 …WSDualHttpBinding主要是 无法使用,因为它实际上是 无法

我有一个托管在服务器上的.Net服务,以及通过internet连接到此服务器的.Net客户端

我想实现一个发布-订阅模型,其中客户端可以订阅服务上的事件,并在数据可用时将数据推送到它们。另一种方法是让客户机轮询服务器以获取数据,但是这可能太慢,无法满足需要。因此需要发布/订阅类型的通信

我知道WCF绑定WSDualHttpBinding确实允许这样做,但是它有一个缺点。根据“WCF服务编程”作者Juval Lowy的说法

…WSDualHttpBinding主要是 无法使用,因为它实际上是 无法通过各种隧道 沟通障碍分隔了 来自客户的服务和需求 查找特定web服务器计算机的步骤 这使得这不切实际

我将其解释为(如果我错了,请纠正我)要使用WSDualHttpBinding进行操作,客户端必须在其机器上打开一个端口(以及任何必要的路由器配置),以便服务器通过该端口进行回调。如果是这种情况,那么使用WSDualHttpBinding将不是我的选择。使用Windows Azure也不是一个选项


因此,我的问题的关键是,如何在不需要打开客户端机器上的端口的情况下通过internet实现发布/订阅/回调类型的通信?开放标准可以,但没有必要,因为客户端和服务器都是.Net,所以Windows Azure不是一个选项。

WSDualHttpBinding包含两个通道,一个从客户端到服务器,另一个从服务器到客户端。后者确实需要防火墙和NAT配置。那么Net.Tcp呢?它只使用单通道,并支持通过该通道从客户端到服务器发起的回调(双工通信)。您提到客户端和服务器都将是.NET应用程序,因此在服务器上配置一些防火墙应该是可能的。

您在文章中提到了大多数选项

有3种选择:

  • 客户端轮询服务器。不需要打开端口,但速度太慢
  • WSDualHttpBinding需要打开端口
  • Azure服务总线可以做到这一点,但不是一个选项
实际上有一种方法可以做到这一点。如果您看看Azure service bus是如何工作的,它会诱使客户机认为它在一个输出端口上,而实际上它是用来向客户机发送消息的。您可以尝试实现此功能


您可以尝试的另一件事是nservicebus at,这是一种开源的.net服务总线。

Internet Communication Engine(ICE)提供

它是开源的,如果您下载了安装,那么有一个示例VisualStudio项目演示了如何实现发布/订阅(请查看“demos”.zip文件和带有时钟演示的“IceStorm”目录)


ICE将为您完成所有繁重的工作,学习曲线非常短,主要是因为文档量大、易懂且编写良好。

我强烈推荐您通过互联网使用DDS(OMG的数据分发服务)

天哪,这就是我要说的。是的,我知道你可能认为OMG结束了。我没有,作为一名政府顾问,我真的在推动标准。请记住,除了自由主义的意识形态和危机,政府仍然是一个巨大的客户,相互合作是必须的

服务巴士?好吧,好吧,那很好,但是现在开始不是太复杂了吗?学习曲线太。。。陡峭的?我想不是,但是,有更简单的吗

冰是个不错的选择。来自CORBA世界的人试图让事情变得更好。不要怀疑它,使用它,尝试它!只是一种感觉:即使使用storm服务,您也可能会觉得您仍然处于请求/回复世界中。。。但这是个骗局吗



但是,如果您更喜欢一个商业但开放的解决方案,可以考虑使用协议缓冲区发布订阅(搜索Google协议缓冲区)。。。这只是第一步。这是我的工作。。。抱歉,这只是一个初始项目,但我正在使用一个中央代理发行版作为替代传输(默认为多播,但广播和udp也可用)。开源,所以免费…

谢谢,我会看看这个选项。