我们拥有“标准”三层架构,中间层托管在 IIS 中并通过 .net 远程处理进行访问。这些错误发生在我们的 Web 和 Web 服务服务器(前端层)之间,这些服务器远程连接到应用程序服务器(中间层)。在当天约 130K 的总调用中,我们每天会收到 3-10 次此错误。
异常和堆栈跟踪总是看起来与此类似:
<小时/>Exception Type: System.Net.WebException
Message: The underlying connection was closed: An unexpected error occurred on a receive.
Server stack trace:
at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessResponseException(WebException webException, HttpWebResponse& response)
at System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at XXXXX.BusinessFacade.Interface.XXXXInterface.SubmitXXXX(
at XXX.XXXXWebServicesLibrary.XXXXService.CreateXXXXXX.RunXXXXMethod()
at XXX.XXXXWebServicesLibrary.XXXXService.XXXXXXMethod`2.RunMethod()
at XXX.XXXXWebServicesLibrary.XXXXXWebMethod`2.Run()HandleReturnMessage()
Inner Exception:
Exception Type: System.IO.IOException
Message: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)Read()
Inner Exception:
Exception Type: System.Net.Sockets.SocketException
Message: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)Receive()
<小时/>
没有特定的远程调用会导致这种情况发生,它可以是其中任何一个,这似乎排除了任何类型的应用程序特定原因。唯一的共同点是错误的“异常类型:System.Net.Sockets.SocketException 消息:现有连接被远程主机强制关闭”部分。
前层和中层由防火墙隔开,我们还使用 VIP 设备。我强烈怀疑我们的网络/防火墙配置有问题,但我们的网络人员只是摸不着头脑,没有提供任何建议。
虽然 0.003% 的故障率可能看起来微不足道,但我们的合作伙伴非常仔细地审查我们的通信,我只是在等待这成为他们注意到的问题。当那个时刻到来时,我不想不得不说“我不知道”。
有谁知道我如何向我们的网络人员提供更多信息或建议来解决此问题?
最佳答案
问题出在 Cisco CSS 上。我们通过将第 1 层服务器直接指向第 2 层服务器并持续 48 小时而没有观察到问题来确定这一点。一旦我们确定这是 CSS 的问题,我们就通过调整该参数极低的默认值来纠正这个问题:
“TCP 或 UDP 端口的默认流不活动超时(以秒为单位)。如果流空闲时间达到超时值中指定的时间,CSS 将拆除该流并回收流资源。”
我们将其设置为 84(即 84 个 16 秒增量)。由于HTTP默认的keep-alive是120秒,所以默认值太低了。
关于iis - 我们如何解决由 Cisco CSS 引起的间歇性 "An existing connection was forcibly closed"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426885/