WCF Net.tcp 仅在本地失败
Posted
技术标签:
【中文标题】WCF Net.tcp 仅在本地失败【英文标题】:WCF Net.tcp fails locally only 【发布时间】:2017-10-16 02:00:48 【问题描述】:短版:我有一个自托管的 WCF 服务,我无法让 本地 应用程序通过 net.tcp 与其通信。
详细说明:我们的环境有几个自托管服务,它们都通过 net.tcp 相互通信。有问题的服务 (A) 公开了一个基于 net.tcp 的端点,该端点被其他盒子上的至少 3 个其他服务使用。
我们最近在另一个服务 (B) 和 (A) 之间建立了新连接。 (B) 和 (A) 都托管在同一个盒子上。此连接拒绝工作,导致以下错误。
套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。本地套接字超时为 '00:59:59.9688006'。
内部异常: 现有连接被远程主机强行关闭
我确实将绑定配置从 (A) 复制并粘贴到 (B) 中,但没有成功。我创建了一个能够复制此问题的测试应用程序。它可以在网络上的任何机器上工作,除了 (A) 的主机。
只是为了好玩,服务 (B) 能够使用相同的绑定类型与服务 (C) 进行通信,服务 (C) 也与 (A) 在同一个盒子上。我什至将 (C) 中的绑定放入 (A) 中,测试应用和 (B) 也看到了相同的行为。
我已经检查并测试了所有我能找到的 net.tcp 连接问题的解决方案,但都没有运气。
我与 IT 和我们的安全官进行了核实,从他们的角度来看,他们都无法想到可能导致这种情况的任何事情。
这是到 (A) 的第一个本地连接,到目前为止,所有其他连接都来自其他盒子。
更新: 服务器绑定sn -p
<netTcpBinding>
<binding name="TMSNetBinding"
closeTimeout="01:00:00"
openTimeout="00:00:20"
receiveTimeout="01:00:00"
sendTimeout="01:00:00"
maxBufferPoolSize="600000000"
maxBufferSize="30000000"
maxReceivedMessageSize="30000000"
maxConnections="100"
portSharingEnabled="false"
listenBacklog="100"
transferMode="Buffered"
hostNameComparisonMode="StrongWildcard">
<readerQuotas maxArrayLength="25000"
maxBytesPerRead="4096"
maxDepth="32"
maxNameTableCharCount="30000"
maxStringContentLength="300000" />
<security mode="None">
<transport clientCredentialType="Windows"
protectionLevel="EncryptAndSign" />
</security>
</binding>
</netTcpBinding>
<endpoint binding="netTcpBinding"
bindingConfiguration="TMSNetBinding"
contract="TMS.Internal.ITMSInternalOperations" />
在代码中,基本服务地址是“net.tcp://localhost:888/TMS/”
【问题讨论】:
你是如何定义连接字符串的?使用本地主机?还是机器名? 这是一个可解析的名称。地址="net.tcp://TMS.dev.company.com:888/TMS" 那么您是否已验证此地址解析为给定计算机上的相同 IP 地址?您确定没有导致问题的主机文件条目吗?没有防火墙规则可能会阻止来自同一台机器的请求? WCF 中实际上没有任何东西可以防止这种情况发生,所以它一定是网络堆栈中的东西.. 防火墙、dns、主机文件条目、路由表等等...... 是的,是的,是的。我什至用 localhost、127.0.0.1 和机器名更新了客户端配置。都有相同的结果。 就是这样。如果您的服务绑定到特定接口,那么它可能在 127.0.0.1 上不可用,所以如果您的所有测试都强制它这样做,那可能就是问题所在。 【参考方案1】:如前所述,有另一台服务器 (C) 在非常相似的情况下工作。我花了很多时间比较两者,我能发现的唯一区别是两种服务之间的自托管实现方式不同。失败的服务有一个过度设计的抽象,我无法准确地确定导致问题的混乱部分。然而,将整个堆拆掉并用简单的自托管替换它解决了这个问题。
【讨论】:
以上是关于WCF Net.tcp 仅在本地失败的主要内容,如果未能解决你的问题,请参考以下文章
除非客户端和服务器使用相同的 Windows 身份,否则带有 sspi 的 WCF Net.tcp 会失败