9

另请参阅WCF 服务器如何通知 WCF 客户端有关更改?(比简单轮询更好的解决方案,例如评论或长轮询)

我需要通过客户端防火墙将推送技术与 WCF 一起使用。这一定是一个常见问题,我知道它在理论上是有效的(见下面的链接),但我没能让它工作,我也找不到演示它的代码示例。

要求:

  • WCF
  • 客户端通过 tcp 端口 80 (netTcpBinding) 连接到服务器。
  • 服务器以不规则的时间间隔(1 分钟到几个小时)推送信息。
  • 用户不必配置他们的防火墙,服务器推送必须通过所有入站端口关闭的防火墙。为此需要同一连接上的 TCP 双工,双重绑定不起作用,因为必须在客户端防火墙上打开端口。
  • 客户端定期(可能每 15 分钟)向服务器发送心跳,因此服务器知道客户端仍然活着。
  • 服务器是带有 WAS 的 IIS7。

解决方案似乎是双工 netTcpBinding。基于此信息:

WCF 通过防火墙和 NAT

在 IIS 中保持连接打开

但是我还没有找到有效的代码示例。我尝试将 Microsoft 的 WCF 示例中的“Duplex”和“TcpActivation”示例组合在一起,但没有任何运气。请有人指点我可以工作的示例代码,或构建一个小型示例应用程序。非常感谢!

4

6 回答 6

5

我找到了几个解决方案:

带有商业选项的ZeroC Ice GPL。只测试过很快。看起来比 .NET Remoting 更强大,并且开发得非常积极。

RemObjects Commercial,积极开发,支持一切,但似乎没有 GenuineChannels 使用的所有更高级的功能。

正版频道。它使用带有许多不错的附加功能的远程处理,最重要的是它通过 NAT 工作而无需打开客户端防火墙。不幸的是,似乎已经很死了。

另一种解决方案是在 IIS 中使用流式传输,根据这篇文章:在 IIS 中保持连接打开

客户端在端口 80 与服务器建立第一个连接(使用 IIS6 的 http,使用 IIS7 的 tcp),然后连接保持打开状态,并带有永不结束的流式响应。

我没有时间对此进行试验,也没有找到说明它专门解决了防火墙问题的示例,但这里有一个可能有效的优秀示例:Streaming XML

于 2008-10-15T08:32:34.547 回答
2

您是否尝试过查看: http: //www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

你能提供你已经尝试过的例子吗?带有防火墙等详细信息,错误消息?

如果客户端和服务器都可以直接解决并且防火墙不是问题,您是否考虑过允许客户端注册提供受支持合同的 URL。然后,服务器可以在需要时调用此服务,而无需建立长时间运行(但主要是空闲连接),避免心跳,并且可以跨会话\连接进行弹性处理。

于 2008-10-13T21:43:33.437 回答
1

在大多数防火墙设置中,如果 TCP 连接空闲,防火墙将断开它以节省资源。空闲超时可能不是您可以控制的。如果它们处于空闲状态并且达到资源限制,有些人会将它们拆除。

大多数公司环境无论如何都不允许任何机器建立出站 TCP 连接。

此外,使用这种机制意味着您将遇到扩展问题。我认为更可靠的解决方案是将信息排队并让您的客户定期轮询他们。如果可能,请使用缓存,以便后续客户端轮询将从客户代理缓存中获取缓存数据(如果他们正在使用)。

如果您必须在亚秒级的土地(即金融服务)中及时推送数据,那么请考虑一些消息传递基础架构,例如客户端的 NServiceBus 分发器,但这需要客户安装......

那么您是否尝试过使用 Toredo?读到它会出现在那里,用户设置起来可能太复杂了。

于 2008-08-22T16:47:52.007 回答
1

我没有尝试过你所说的场景,所以我不能提供太多帮助,对不起。如果您需要绕过的只是客户端防火墙,您可能需要查看这篇文章

祝你好运。

于 2008-10-12T06:00:52.887 回答
1

你试过这个吗? 双工HttpBinding

它使用封装为自定义 WCF 绑定的智能轮询技术。所以它应该开箱即用。

于 2009-10-23T00:58:32.103 回答
-1

您可以在客户端中进行以下更改,以便在启用防火墙的客户端上访问双工 Web 服务。

  • 在防火墙 -> 高级 -> 设置(网络连接设置)-> Web 服务器(Http)中选中设置 WebHttp 选项
于 2010-03-23T07:24:41.430 回答