C# 使用wsDualHttpBinding超时通过internet连接到WCF服务

C# 使用wsDualHttpBinding超时通过internet连接到WCF服务,c#,wcf,C#,Wcf,仍处于WCF学习曲线上: 我已经建立了一个自托管WCF服务(WSDualHttpBinding),它可以在我自己的计算机上正常工作,它位于防火墙后面。如果我在自己的电脑上运行客户端,一切都会很好 现在,我将客户端安装在网络之外的计算机上,并尝试通过动态DNS访问该服务,如下所示:http://mydomain.dyndns.org:8000/MyService。我的港口运输问题在一个小时内得到了解决;我现在可以在浏览器中看到该服务已启动 但现在,当我尝试在另一台计算机上运行客户端时,我收到以下错

仍处于WCF学习曲线上:

我已经建立了一个自托管WCF服务(WSDualHttpBinding),它可以在我自己的计算机上正常工作,它位于防火墙后面。如果我在自己的电脑上运行客户端,一切都会很好

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

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


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

WSDualHttpBinding存在一个真正的问题,大多数人连接到互联网的方式——在路由器后面意味着,至少在IPv4中,NAT破坏了一方,正如你已经发现的那样

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

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

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

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

  • 切换到
    NetTcpBinding
    通常只需要更改配置-代码保持不变。它简单、快速、麻烦小得多,而且最重要的是——它可以正常工作。

    +1——答案很好,听起来研究得很好——将尝试它!与此同时,我感到困惑,bc您的答案似乎与@TomTom在回答我之前的问题()时所写的内容相冲突,根据这一点,.NET4可以很好地解决所有这些NAT问题。你不同意吗?@Shaul:我不知道WCF4在WSDualHttpBinding的NAT问题上有任何变化。我试着搜索TomTom提到的内容,但什么也找不到。我还对他的回答发表了评论,希望得到更多细节。顺便说一句,我的答案根本没有被研究过——这都是从经验中得出的——我遇到了与你完全相同的问题。@Allon-它起作用了!至少是这样,在一个方向上。当我试图从服务器调用客户机时,我得到了一个关于ContractFilter不匹配和EndpointDispatcher的长错误。当我在自己的机器上测试时,它工作得很好。我还需要进行哪些其他配置更改?我的ServiceContract的命名空间必须从“”更改为“net”。tcp://mynamespace"? (抱歉,如果这些问题看起来真的很愚蠢——我是新手!)事实上,@Allon在这个问题上已经应该得到充分的回答。我刚刚在这里问了另一个问题,以涵盖我们需要跨越的下一个障碍:我一直在想,netTcpBinding优于HTTP的好处是什么