WCF通过防火墙推送到客户端?

时间:2008-08-22 13:27:54

标签: .net wcf firewall push duplex

  

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

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

要求:

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

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

WCF through firewalls and NATs

Keeping connections open in IIS

但我还没有找到一个有效的代码示例..我尝试将微软的WCF样本中的“Duplex”和“TcpActivation”样本结合起来,没有任何运气。请有人指出我可以使用的示例代码,或构建一个小样本应用程序。非常感谢!

6 个答案:

答案 0 :(得分:4)

我找到了几个解决方案:

ZeroC Ice GPL有商业选项。只进行了快速测试。看起来比.NET Remoting更强大,并且非常积极地开发。

RemObjects商业,积极的开发,支持所有内容,但似乎没有GenuineChannel使用的所有更高级的功能。

GenuineChannels。它使用具有许多很好添加功能的远程处理,最重要的一个是通过NAT工作而无需打开客户端防火墙。不幸的是,似乎已经死了。

另一种解决方案是根据本文使用与IIS的流式传输:Keeping connections open in IIS

客户端在端口80向服务器发出第一个连接(带有IIS6的http,带有IIS7的tcp),然后连接保持打开,并且流式响应永远不会结束。

我没有时间去试验这个,我还没有找到一个样本,说它专门解决了防火墙问题,但这里有一个很好的样本可能有效:Streaming XML

答案 1 :(得分:2)

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

您能举例说明您已尝试过的内容吗?有关防火墙等的详细信息,错误消息?

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

答案 2 :(得分:1)

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

大多数公司环境都不允许任何计算机进行出站TCP连接。

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

如果你必须及时推送数据,在亚秒级土地(即金融服务),那么考虑一些消息传递基础设施,如客户端的NServiceBus分销商,但这需要客户安装...

你有没有尝试使用Toredo?读过它会出现在那里,对于用户来说设置太复杂了。

答案 3 :(得分:1)

我没有尝试过你所说的情景,所以我不能帮助太多,抱歉。如果您需要绕过的只是客户端防火墙,您可能需要查看this post

祝你好运。

答案 4 :(得分:1)

你试过这个吗? DuplexHttpBinding

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

答案 5 :(得分:-1)

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

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