【问题标题】:Connecting over internet to WCF service using wsDualHttpBinding times out使用 wsDualHttpBinding 通过 Internet 连接到 WCF 服务超时
【发布时间】:2010-12-24 12:21:03
【问题描述】:

仍在 WCF 学习曲线上:

我设置了一个自托管的 WCF 服务 (WSDualHttpBinding),它在我自己的计算机上运行良好,它位于防火墙后面。如果我在自己的计算机上运行客户端,一切正常。

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

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

我已禁用服务的安全性,所以不是这样。还有什么可能阻止连接发生?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    WSDualHttpBinding 和大多数人连接到互联网的方式存在一个真正的问题 - 位于路由器后面意味着,至少对于 IPv4,NAT 会毁了聚会,正如您已经发现的那样。

    使用WSDualHttpBinding,您有两个连接:从客户端到服务器,以及从服务器到客户端。

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

    建议您切换到NetTcpBinding,而不是尝试让WSDualHttpBinding 工作。由于WSDualHttpBindingNetTcpBinding 都是仅限WCF、仅限Microsoft 的专有连接方案,因此您不会在互操作性方面损失太多。另一方面,你得到的却是很多:

    1. NetTcpBinding 只使用一个连接,从客户端到服务器,同时允许像WSDualHttpBinding 这样的双向通信。因此无需在客户端处理端口开放/转发 - NAT 不是问题。
    2. 通信协议是二进制的,比WSDualHttpBinding 中使用的纯文本 XML 更紧凑。更少的数据传输意味着更好的服务。
    3. 使用NetTcpBinding,您可以在客户端断开连接时获得即时通知,因为套接字已关闭。无需像使用 WSDualHttpBinding 那样等待 HTTP 超时。
    4. 单一连接意味着没有任何东西可以不同步 - 使用WSDualHttpBinding,两个连接中的一个可能会断开,而另一个可能仍然处于活动状态,只有一种通信方式。 WCF 有办法解决这个问题,但最好一开始就避免这个问题。

    切换到NetTcpBinding 通常只需要更改配置 - 代码保持不变。它简单、快速、麻烦少得多,最重要的是 - 它很有效。

    【讨论】:

    • +1 - 很好的答案,听起来很好研究 - 会试试看!与此同时,我只是感到困惑,因为您的回答似乎与@TomTom 在他对我之前的问题 (stackoverflow.com/questions/4461591/…) 的回答中所写的内容相冲突,据此,.NET 4 可以很好地解决所有这些 NAT 问题。你不同意吗?
    • @Shaul:我不知道 WCF4 中有关 WSDualHttpBinding 的 NAT 问题的任何更改。我试图搜索 TomTom 提到的内容,但找不到任何东西。我也评论了他的回答,希望有更多的细节。顺便说一句,我的答案根本没有经过研究 - 这完全来自经验 - 我遇到了与您完全相同的问题。
    • @Allon - 它正在工作!至少 - 它是,在一个方向。当我尝试从服务器调用客户端时,我收到一个关于 ContractFilter 不匹配和 EndpointDispatcher 的长错误。当我在自己的机器上测试所有内容时,它工作正常。我还需要进行哪些其他配置更改?我的 ServiceContract 的命名空间必须从“mynamespace”更改为“net.tcp://mynamespace”吗? (对不起,如果这些问题看起来真的很愚蠢 - 我是新手!)
    • 实际上,就这个问题而言,@Allon 已经值得充分回答。我刚刚在这里问了另一个问题,以涵盖我们需要跳过的下一个箍:stackoverflow.com/q/4534923/7850
    • 我一直想知道 netTcpBinding 相对于 HTTP 的好处
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多