3

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

我想实现一个发布订阅模型,客户端可以订阅服务上的事件,并在数据可用时将数据推送给他们。另一种方法是让客户端轮询服务器以获取数据,但这对于所需的内容可能太慢了。因此需要发布/订阅类型的通信。

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

... WSDualHttpBinding 几乎无法使用,因为实际上不可能通过将服务与客户端分开的各种通信障碍进行隧道传输,并且需要找到特定的 Web 服务器机器使得这不切实际。

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

所以我的问题的症结在于,我怎样才能在互联网上实现发布/订阅/回调类型的通信,而不需要在客户端机器上打开端口?开放标准是可以的,但没有必要,因为客户端和服务器都是 .Net,Windows Azure 不是一个选项。

4

4 回答 4

2

Internet Communication Engine (ICE) 提供IceStorm,一种发布/订阅服务

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

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

于 2011-03-01T13:26:09.240 回答
2

您在帖子中提到了大多数选项。

有 3 个选项:

  • 客户端轮询服务器。不需要开放端口,但速度太慢。
  • WSDualHttpBinding 需要打开端口
  • Azure 服务总线会这样做,但不是一个选项。

实际上有一种方法可以做到这一点。如果您查看 Azure 服务总线的工作原理,它会诱使客户端认为它位于输出端口上,而实际上它是用于向客户端发送消息的。您可以尝试实现此功能。

您可以尝试的另一件事是http://nservicebus.com/上的 nservicebus ,这是一个开源 .net 服务总线。

于 2010-09-26T09:01:57.170 回答
2

WSDualHttpBinding contains two channels one from client to server and second from server to client. The later one indeed requires firewall and NAT configuration. What about Net.Tcp? It uses only single channel and supports callbacks (duplex communication) over that channel initiated from client to server. You mentioned that both client and server will be .NET application so it should be possible with some firewall configuration on the server.

于 2010-09-26T08:46:34.313 回答
0

我强烈建议您通过 Internet http://www.omg.org/news/meetings/workshops/Real-time_WS_Final_Presentations_2008/Session%203/03-02_Bertocci_et_al.pdf向您推荐 DDS(来自 OMG 的数据分发服务)

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

服务总线?好的,好的,这很好,但是现在开始是不是太复杂了?学习曲线太……陡峭?我想不是,但是,更简单的一个吗?

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


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

于 2012-04-08T16:03:07.853 回答