WCF Net.tcp 仅在本地失败
WCF Net.tcp fails locally only
简短版本:我有一个自托管的 WCF 服务,我无法让 local 应用程序通过 net.tcp.
与之通信
详细说明:我们的环境有几个自托管服务,它们都通过 net.tcp 相互通信。有问题的服务 (A) 公开了一个基于 net.tcp 的端点,该端点被其他盒子上的至少 3 个其他服务使用。
我们最近在另一项服务 (B) 和 (A) 之间建立了新连接。 (B) 和 (A) 都托管在同一个盒子上。此连接拒绝工作导致以下错误。
The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:59:59.9688006'.
Inner Exception:
An existing connection was forcibly closed by the remote host
我已经从字面上将绑定配置从 (A) 复制并粘贴到 (B) 中,但没有成功。我创建了一个能够重现此问题的测试应用程序。它适用于网络上的任何机器,除了 (A) 的主机。
只是为了好玩,服务 (B) 能够与服务 (C) 通信,服务 (C) 也与 (A) 在同一个盒子上,使用相同的绑定类型。我什至将 (C) 的绑定放到 (A) 中,测试应用程序和 (B) 也看到了相同的行为。
我已经检查并测试了所有我能找到的 net.tcp 连接问题的解决方案,但没有成功。
我咨询了 IT 人员和我们的安全官,从他们的角度来看,他们都想不出任何可能导致这种情况的事情。
这是到 (A) 的第一个本地连接,到目前为止所有其他连接都来自其他盒子。
更新:
服务器绑定片段
<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/"
如前所述,还有另一台服务器 (C) 在非常相似的情况下工作。我花了很多时间比较这两者,我能发现的唯一区别是这两种服务的自托管实现方式不同。失败的服务有一个过度设计的抽象,我无法准确地确定是那个混乱的部分导致了这个问题。然而,将整堆都撕掉并用简单的自我托管代替它解决了这个问题。
简短版本:我有一个自托管的 WCF 服务,我无法让 local 应用程序通过 net.tcp.
与之通信详细说明:我们的环境有几个自托管服务,它们都通过 net.tcp 相互通信。有问题的服务 (A) 公开了一个基于 net.tcp 的端点,该端点被其他盒子上的至少 3 个其他服务使用。
我们最近在另一项服务 (B) 和 (A) 之间建立了新连接。 (B) 和 (A) 都托管在同一个盒子上。此连接拒绝工作导致以下错误。
The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:59:59.9688006'.
Inner Exception: An existing connection was forcibly closed by the remote host
我已经从字面上将绑定配置从 (A) 复制并粘贴到 (B) 中,但没有成功。我创建了一个能够重现此问题的测试应用程序。它适用于网络上的任何机器,除了 (A) 的主机。
只是为了好玩,服务 (B) 能够与服务 (C) 通信,服务 (C) 也与 (A) 在同一个盒子上,使用相同的绑定类型。我什至将 (C) 的绑定放到 (A) 中,测试应用程序和 (B) 也看到了相同的行为。
我已经检查并测试了所有我能找到的 net.tcp 连接问题的解决方案,但没有成功。
我咨询了 IT 人员和我们的安全官,从他们的角度来看,他们都想不出任何可能导致这种情况的事情。
这是到 (A) 的第一个本地连接,到目前为止所有其他连接都来自其他盒子。
更新: 服务器绑定片段
<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/"
如前所述,还有另一台服务器 (C) 在非常相似的情况下工作。我花了很多时间比较这两者,我能发现的唯一区别是这两种服务的自托管实现方式不同。失败的服务有一个过度设计的抽象,我无法准确地确定是那个混乱的部分导致了这个问题。然而,将整堆都撕掉并用简单的自我托管代替它解决了这个问题。