我有一个基于WCF的Windows服务,它通过TCP连接从外部设备(比例)读取。 当服务最初启动时,与设备建立连接。 这是我们用来启动与设备连接的代码:
scaleData.Client = New TcpClient(ipAddress, (portNumber))
scaleData.Stream = scaleData.Client.GetStream()
该服务作为Windows服务托管(而不是通过IIS)。
我们有两个从WCF服务中提取数据的应用程序, 一个asp.net应用程序和一个winforms应用程序。
请求将数据从流返回给调用者/客户端。
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连接并从流中读取,但这似乎无法解决问题。我还启用了日志记录,捕获日志文件的异常。所有日志显示都是上面提到的消息。
有没有人对这里发生的事情有任何建议? 这是防火墙/端口/病毒扫描程序问题吗?
我们如何才能最好地进行?
正如我之前提到的,大部分服务都可以工作并从TCP连接中检索所需的结果。它似乎偶尔会失败,但最终会失败。
谢谢, JohnB
答案 0 :(得分:0)
有一些可能的原因,尤其是在您运行大量交易时。
以下是一些可能有助于解决此问题的信息:
始终从跟踪信息开始,以了解全局: WCF / ServiceModel 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
connectionManagement http://msdn.microsoft.com/en-us/library/fb6y0fyc%28v=vs.110%29.aspx