为什么我们的 Windows 服务应用程序的 TCP 连接失败 "Unable to read data from the transport connection... closed by the remote host."?
Why does our Windows service app's TCP connection fail with "Unable to read data from the transport connection... closed by the remote host."?
我有一个基于 WCF 的 windows 服务,它通过 TCP 连接从外部设备(秤)读取数据。
服务最初启动时会与设备建立连接。
这是我们用来启动与设备的连接的代码:
scaleData.Client = New TcpClient(ipAddress, (portNumber))
scaleData.Stream = scaleData.Client.GetStream()
该服务托管为 Windows 服务(而不是通过 IIS)。
我们有两个从 WCF 服务中提取数据的应用程序,
asp.net 应用程序和 winforms 应用程序。
请求returns数据从流到caller/client。
Try
Dim bytes As Int32 = scaleData.Stream.Read(data, 0, data.Length)
responseData = Text.Encoding.ASCII.GetString(data, 0, bytes)c
Catch ex As IOException
exceptionMsg = String.Format("IOEXCEPTION!!! :: {0}", ex.Message)
End Try
(winforms) 测试应用程序、Web 应用程序和 windows 服务都位于同一台 Windows 7 机器上。
在大多数情况下,此配置工作正常。但有时它会失败。(我们不能完全确定它的模式或它发生的细节)使用以下消息:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
在失败时,我们现在添加了重试逻辑以尝试重新建立 TCP 连接并从流中读取,但这似乎无法解决问题。我还启用了日志记录,它将异常捕获到日志文件中。所有日志显示都是上面提到的消息。
有人对这里发生的事情有什么建议吗?
这是 Firewall/Port/virus 扫描仪问题吗?
我们如何最好地进行?
正如我之前提到的,该服务大部分工作并从 TCP 连接检索所需的结果。好像只是偶尔失败,但最终还是会失败。
谢谢,
约翰B
有几个可能的原因,特别是如果您 运行 交易量很大。
- 您可能会达到 WCF 连接限制
- 您可能达到了 IIS 连接限制
- 您的客户端可能运行 TCP 端口不足
- 您可能让病毒扫描程序充当客户端计算机上的代理并中断连接
以下是一些可能有助于解决此问题的信息:
始终从跟踪信息开始,了解全局:
WCF/服务模型
http://msdn.microsoft.com/en-us/library/ms733025%28v=vs.110%29.aspx
System.Net / 网络追踪
http://msdn.microsoft.com/en-us/library/ty48b824%28v=vs.110%29.aspx
避免 TCP/IP 端口耗尽(特定于 BizTalk 但仍然适用)
http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
大数据和流媒体
http://msdn.microsoft.com/en-us/library/ms733742%28v=vs.110%29.aspx
连接管理
http://msdn.microsoft.com/en-us/library/fb6y0fyc%28v=vs.110%29.aspx
我有一个基于 WCF 的 windows 服务,它通过 TCP 连接从外部设备(秤)读取数据。 服务最初启动时会与设备建立连接。 这是我们用来启动与设备的连接的代码:
scaleData.Client = New TcpClient(ipAddress, (portNumber))
scaleData.Stream = scaleData.Client.GetStream()
该服务托管为 Windows 服务(而不是通过 IIS)。
我们有两个从 WCF 服务中提取数据的应用程序, asp.net 应用程序和 winforms 应用程序。
请求returns数据从流到caller/client。
Try
Dim bytes As Int32 = scaleData.Stream.Read(data, 0, data.Length)
responseData = Text.Encoding.ASCII.GetString(data, 0, bytes)c
Catch ex As IOException
exceptionMsg = String.Format("IOEXCEPTION!!! :: {0}", ex.Message)
End Try
(winforms) 测试应用程序、Web 应用程序和 windows 服务都位于同一台 Windows 7 机器上。
在大多数情况下,此配置工作正常。但有时它会失败。(我们不能完全确定它的模式或它发生的细节)使用以下消息:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
在失败时,我们现在添加了重试逻辑以尝试重新建立 TCP 连接并从流中读取,但这似乎无法解决问题。我还启用了日志记录,它将异常捕获到日志文件中。所有日志显示都是上面提到的消息。
有人对这里发生的事情有什么建议吗? 这是 Firewall/Port/virus 扫描仪问题吗?
我们如何最好地进行?
正如我之前提到的,该服务大部分工作并从 TCP 连接检索所需的结果。好像只是偶尔失败,但最终还是会失败。
谢谢, 约翰B
有几个可能的原因,特别是如果您 运行 交易量很大。
- 您可能会达到 WCF 连接限制
- 您可能达到了 IIS 连接限制
- 您的客户端可能运行 TCP 端口不足
- 您可能让病毒扫描程序充当客户端计算机上的代理并中断连接
以下是一些可能有助于解决此问题的信息:
始终从跟踪信息开始,了解全局: WCF/服务模型 http://msdn.microsoft.com/en-us/library/ms733025%28v=vs.110%29.aspx
System.Net / 网络追踪 http://msdn.microsoft.com/en-us/library/ty48b824%28v=vs.110%29.aspx
避免 TCP/IP 端口耗尽(特定于 BizTalk 但仍然适用) http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
大数据和流媒体 http://msdn.microsoft.com/en-us/library/ms733742%28v=vs.110%29.aspx
连接管理 http://msdn.microsoft.com/en-us/library/fb6y0fyc%28v=vs.110%29.aspx