我在服务器上托管了.Net服务,并且.Net客户端通过互联网连接到此服务器。
我想实现一个发布订阅模型,客户端可以订阅服务上的事件,并在数据可用时将数据推送到它们。另一种方法是让客户端在服务器上轮询数据,但这可能对于所需的内容来说太慢了。因此需要发布/订阅类型的通信。
据我所知,WCF绑定WSDualHttpBinding确实允许这样做,但它有一个缺点。根据“编程WCF服务”作者Juval Lowy,
......主要是WSDualHttpBinding 因为它实际上是无法使用的 不可能通过各种隧道 分离的沟通障碍 来自客户的服务和需求 找到一个特定的Web服务器机器 使这不切实际。
我已经解释了这意味着(请纠正我,如果我错了)要使用WSDualHttpBinding操作,客户端必须在他们的机器上打开一个端口(以及任何必要的路由器配置),以便服务器回调通过。如果是这种情况,使用WSDualHttpBinding对我来说不是一个选择。使用Windows Azure也不是一种选择。
所以我的问题的关键是,如何通过互联网实现发布/订阅/回调类型的通信,而无需在客户端计算机上打开端口?开放标准是可以的,但不必要,因为客户端和服务器都是.Net,Windows Azure不是一种选择。
答案 0 :(得分:2)
WSDualHttpBinding包含两个从客户端到服务器的通道,第二个从服务器到客户端。后者确实需要防火墙和NAT配置。那么Net.Tcp呢?它仅使用单个通道,并支持从客户端到服务器启动的通道上的回调(双工通信)。您提到客户端和服务器都是.NET应用程序,因此应该可以在服务器上进行一些防火墙配置。
答案 1 :(得分:2)
您在帖子中提到了大多数选项。
有3种选择:
实际上有一种方法可以做到这一点。如果你看一下Azure服务总线是如何工作的,它会诱使客户认为它是在一个外向端口上,当真正用于向客户端发送消息时。您可以尝试实现此功能。
你可以尝试的另一件事是http://nservicebus.com/的nservicebus,这是一个开源的.net服务总线。
答案 2 :(得分:2)
Internet Communication Engine(ICE)提供IceStorm, a publish/subscribe service。
它是开源的,如果您下载安装,则有一个示例Visual Studio项目,演示如何实现发布/订阅(使用时钟演示检查“演示”.zip文件和“IceStorm”目录)。
ICE将为您完成所有繁重的工作,学习曲线非常短,主要是因为文档规模庞大,平易近人且写得很好。
答案 3 :(得分:0)
来自OMG,这就是我要说的。是的,我知道你可能认为OMG结束了。我没有,作为一名政府顾问,我真的在推动标准。请记住,除了自由主义的意识形态和危机之外,政府仍然是一个巨大的客户,互通是必须的。
NServiceBus?是的,好的,没关系,但现在开始并不太复杂?学习曲线太......陡峭?我想不是,但是,更容易吗?
ICE是个不错的选择。来自CORBA世界的人试图让事情变得更好。不要怀疑它,使用它,试试吧!只是一种感觉:即使有风暴服务,你可能会觉得你还在请求/回复世界......但这是一个骗局?但如果您更喜欢商业但开放的解决方案,请考虑使用协议缓冲区发布订阅(搜索Google协议缓冲区)......只是第一种方法http://protocolbus.casessite.org。这是我自己的工作...对不起它只是一个初始项目,但我正在使用中央代理分发作为替代传输(默认是多播但广播和udp也可用)。开源,所以是免费的......