通过互联网连接使用wsDualHttpBinding连接WCF服务超时

6

仍在学习WCF:

我已经设置了一个自托管的WCF服务(WSDualHttpBinding),在我的电脑上运行良好,我的电脑位于防火墙后面。如果我在我的电脑上运行客户端,一切都很好。

现在我将客户端安装在我的网络之外的计算机上,并尝试通过动态DNS访问服务,如下所示:http://mydomain.dyndns.org:8000/MyService。我的端口转发问题在上一个问题中得到解决;我现在可以在浏览器中看到服务正常运行。

但是,当我尝试在其他计算机上运行客户端时,我会收到以下错误消息:“打开操作未在00:01:00的分配超时内完成。此操作分配的时间可能是较长超时的一部分。”

我已经在服务上禁用了安全性,所以不是这个原因。还有什么可能阻止连接发生?

1个回答

30

使用 WSDualHttpBinding 遇到了一个问题,大多数人通过路由器连接互联网,这意味着至少对于 IPv4,NAT 会破坏它的作用,就像你已经发现的那样。

使用 WSDualHttpBinding,你有两个连接:从客户端到服务器和从服务器到客户端。

通常情况下,客户端到服务器的连接不是什么大问题 - 这是互联网上的大多数通信方式。在你的情况下,似乎你在防火墙后面,并且已经打开或转发了所需的端口。但这并不能解决第二个连接的问题 - 从服务器到客户端。实际上,第二个连接发生的情况是客户端充当服务器,服务器充当客户端。因此,每个连接到您的服务的客户端都需要进行相同的端口开放/转发,因为它也充当服务器!这当然是对您服务的每个用户提出的不合理要求。这就是为什么 WSDualHttpBinding 更适合服务器间通信的原因,其中设置是一次性事件。

我建议您放弃尝试让 WSDualHttpBinding 工作,并改用 NetTcpBinding。由于 WSDualHttpBindingNetTcpBinding 都是基于 WCF(Windows Communication Foundation)的、仅限于 Microsoft 的专有连接协议,所以在互操作性方面您并没有失去多少。相反,你将获得很多:

  1. NetTcpBinding 仅使用单个连接,从客户端到服务器,同时允许双向通信,就像 WSDualHttpBinding。因此,在客户端不需要处理端口开放/转发 - NAT 不是问题。
  2. 通信协议是二进制的,并且比 WSDualHttpBinding 中使用的纯文本 XML 更紧凑。较少的数据传输意味着更好的服务性能。
  • 使用NetTcpBinding,当客户端断开连接时,可以立即得到通知,因为套接字已关闭。不像WSDualHttpBinding需要等待HTTP超时。
  • 单个连接意味着没有任何可能出现不同步的情况 - 使用WSDualHttpBinding,两个连接中的一个可能会断开,而另一个可能仍然处于活动状态,只有单向通信。虽然WCF有一种处理该问题的方式,但最好首先避免此问题。
  • 切换到NetTcpBinding通常只需要进行配置更改 - 代码保持不变。这简单,快捷,更少麻烦,最重要的是 - 它有效。


    +1 - 很棒的答案,听起来非常有研究 - 我会尝试一下!同时我有点困惑,因为你的答案似乎与@TomTom在我的上一个问题的答案(http://stackoverflow.com/questions/4461591/how-to-establish-2-way-communication-between-a-web-server-and-a-site-server/4461751#4461751)中所写的相矛盾,根据他的说法,.NET 4很好地解决了所有这些NAT问题。你不同意吗? - Shaul Behr
    @Shaul:关于WSDualHttpBinding的NAT问题,我不知道WCF4有任何变化。我尝试搜索TomTom提到的内容,但没有找到任何信息。我还在他的回答中发表了评论,希望能获得更多细节。顺便说一句,我的回答完全没有经过研究 - 这都是从经验中得出的结论 - 我遇到了与你们完全相同的问题。 - Allon Guralnek
    @Allon - 它工作了!至少在一个方向上是这样的。当我试图从服务器向客户端发起调用时,我会收到一个关于ContractFilter不匹配和EndpointDispatcher的长错误信息。当我在自己的机器上测试时,它运行良好。我需要进行哪些其他配置更改?我的ServiceContract的命名空间必须从“http://mynamespace”更改为“net.tcp://mynamespace”吗?(如果这些问题看起来很愚蠢-我是新手!) - Shaul Behr
    实际上,就这个问题而言,@Allon已经值得完全回答的信用。我只是在这里提出了另一个问题,以涵盖我们需要跳过的下一个障碍:http://stackoverflow.com/q/4534923/7850 - Shaul Behr
    我一直在想,相比HTTP,netTcpBinding有什么好处。 - Zach Smith

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接