关于.net:WCF通过防火墙推送到客户端吗?

关于.net:WCF通过防火墙推送到客户端吗?

WCF push to client through firewall?

See also How does a WCF server inform
a WCF client about changes? (Better
solution then simple polling, e.g.
Coment or long polling)

我需要通过客户端防火墙在WCF中使用推送技术。这肯定是一个常见的问题,我知道它在理论上是可行的(请参阅下面的链接),但是我无法使其正常运行,而且我还找不到能够证明它的代码示例。

要求:

  • 世界足球联合会
  • 客户端通过TCP端口80(netTcpBinding)连接到服务器。
  • 服务器以不规则的时间间隔(1分钟到几个小时)推回信息。
  • 用户不必配置防火墙,服务器推送必须通过已关闭所有入站端口的防火墙。为此,需要在同一连接上使用TCP双工,由于必须在客户端防火墙上打开端口,因此双重绑定不起作用。
  • 客户端会定期(可能每15分钟)将心跳发送到服务器,以便服务器知道客户端仍在运行。
  • 服务器是带有WAS的IIS7。

解决方案似乎是双工netTcpBinding。根据此信息:

通过防火墙和NAT的WCF

在IIS中保持连接打开

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


我找到了几种解决方案:

具有商业选项的ZeroC Ice GPL。只经过快速测试。看起来比.NET Remoting更强大,并且非常活跃。

RemObjects Commercial,活跃的开发,支持所有功能,但似乎不具备GenuineChannels使用的所有更高级的功能。

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

根据本文的说法,另一种解决方案是将流与IIS一起使用:保持IIS中的连接打开

客户端在端口80上与服务器建立第一个连接(带有IIS6的http,带有IIS7的tcp),然后该连接保持打开状态,并且流响应永无止境。

我还没有时间尝试这一点,也没有找到一个可以专门解决防火墙问题的示例,但是这里有一个很好的示例可能有效:流XML。


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

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

如果可以直接解决客户端和服务器的问题,并且防火墙不是问题,那么您是否考虑过允许客户端注册提供受支持合同的URL。然后,服务器可以在需要时调用此服务,而无需建立长期运行(但主要是空闲的连接),从而避免了心脏跳动的需要,并且可以使整个会话/连接具有弹性。


你试过这个吗?
双工HttpBinding

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


抱歉,我没有尝试过您所说的情况,所以我不能提供太多帮助。如果您只需要绕过客户端防火墙,则可能需要查看此帖子。

祝好运。


在大多数防火墙设置中,如果TCP连接空闲以节省资源,则TCP连接将被防火墙断开。空闲超时可能不是您可以控制的。如果它们闲置并且正在达到资源限制,则某些服务器将拆除它们。

大多数公司环境始终不允许任何计算机建立出站TCP连接。

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

如果您必须在亚秒级范围内(即金融服务)及时推送数据,请考虑一些消息传递基础架构,例如客户端的NServiceBus分销商,但这将需要客户安装...

那么,您是否尝试过使用Toredo?读过它似乎会出现的地方后,用户设置起来就太复杂了。


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

  • 在防火墙->高级->设置(网络连接设置)-> Web服务器(Http)中选中设置WebHttp选项

推荐阅读