![Timer_EntityBody、Timer_ConnectionIdle 和连接意外关闭](https://linux22.com/image/634400/Timer_EntityBody%E3%80%81Timer_ConnectionIdle%20%E5%92%8C%E8%BF%9E%E6%8E%A5%E6%84%8F%E5%A4%96%E5%85%B3%E9%97%AD.png)
我们有一个 Windows 应用程序,它连接到 Web 服务(托管在 Windows 2008 Server IIS 7.5 上的 XML Web 服务,没有防病毒软件)并将一些数据提取到客户端。但有时(大约 5%-10% 的请求),尝试连接 Web 服务时会出现错误。
这是客户端应用程序错误日志;
Exception:System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly.
at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()
at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object& internalAsyncState, Stream& responseStream)
at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)
at APPClient.APPFPService.WEBService.EndAddMoney(IAsyncResult asyncResult)
at APPClient.BLL.ServiceAgent.AddMoneyCallback(IAsyncResult ar)
另一方面,在 Web 服务器上,我检查了 HTTP 错误日志,看到一个这样的长文件;
2014-06-05 14:02:04 65.82.178.73 53798 SERVER.IP.ADDRESS 80 - - - - - Timer_ConnectionIdle -
2014-06-05 14:07:24 76.109.81.223 58985 SERVER.IP.ADDRESS 80 - - - - - Timer_ConnectionIdle -
2014-06-05 14:07:39 76.109.81.223 2803 SERVER.IP.ADDRESS 80 - - - - - Timer_ConnectionIdle -
2014-06-05 14:08:59 76.109.81.223 52656 SERVER.IP.ADDRESS 80 - - - - - Timer_ConnectionIdle -
2014-06-05 14:09:05 65.82.178.73 53904 SERVER.IP.ADDRESS 80 HTTP/1.1 POST /webservice/webservice.asmx - 2 Timer_EntityBody SYPService
2014-06-05 14:10:55 50.186.180.191 50648 SERVER.IP.ADDRESS 80 - - - - - Timer_ConnectionIdle -
这里是类似的情况,但它对我没有帮助。
更新:当我检查 IIS 日志时,我发现一些类似这样的问题;
cs-method cs-uri-stem sc-status sc-win32-status time-taken cs-version
POST /webservice/webservice.asmx 400 64 46 HTTP/1.1
POST /webservice/webservice.asmx 400 64 134675 HTTP/1.1
POST /webservice/webservice.asmx 400 64 37549 HTTP/1.1
POST /webservice/webservice.asmx 400 64 109 HTTP/1.1
POST /webservice/webservice.asmx 400 64 31 HTTP/1.1
POST /webservice/webservice.asmx 400 64 0 HTTP/1.1
POST /webservice/webservice.asmx 400 64 15 HTTP/1.1
sc-win32-状态 64:指定的网络名称不再可用。
sc-状态 400: 错误的请求
另外,有些请求需要大约 130 秒,但有些请求不到 1 秒。这是一个连接到 Web 服务以处理一些数据的 Windows 应用程序。数据库上的查询没有一个需要大约 130 秒。
答案1
您正在查看 HTTPERR 日志,但它们可能不是全部内容。
这里有一个关于每个代码含义的参考:820729简而言之,上面唯一需要关注的点是 POST,因为耗时太长而被禁止(Timer_EntityBody - 即,在您的应用程序配置的 HTTPAPI 超时之前未收到实体主体)。
目前尚不清楚您是否在 IIS 中托管此应用程序,但我建议如果您收到这些错误,请在应用程序级别 (\inetpub\logs\w3svcxxx) 而不是系统级别 (\windows\system32\logfiles\httperr) 调查它们。
应用程序日志可能包含任何应用程序级别的错误、问题或中断,并且 EventVwr 中的应用程序事件日志中也可能有证据。
答案2
从 IIS 日志中。它显示无法访问 Web 服务或 Web 服务不可用“/webservice/webservice.asmx 400”。单独运行 Web 服务以确认 Web 服务是否在托管 Windows 服务的同一台服务器中启动并运行。如果 Windows 服务和 Web 服务位于不同的位置,这也可能是网络问题。
答案3
400 状态表示“错误请求”。所以这不是服务器端问题。请求有问题。在到达 IIS 之前格式不正确
如果子状态代码不是 0,则更容易排除故障。例如,如果它是 1,则表示“无效目标标头”。如果它是 2,则表示“无效深度标头”。以下是状态代码的完整列表。
64 sc-win32-status 中存在与网络相关的问题。它指的是“指定的网络名称不再可用”。发送响应后,IIS 等待来自客户端的 ACK 包。如果客户端重置连接而不是发送此包,则 IIS 会记录 64 代码,因为这不是正常连接关闭。
Timer_EntityBody 错误意味着“请求实体主体到达之前连接已过期”。
建议
检查服务器中是否有防病毒或网络端点保护等软件。卸载它们并监控系统一段时间,看看问题是否再次发生(注意:有时禁用它们并不意味着它们不再在后台运行。卸载是从故障排除过程中消除它们的最终方法)
与第三方产品支持人员合作,查看是否有任何因素阻碍请求完全发送。应用程序可能正在启动连接但尚未完成
请与网络团队联系,分析 Web 服务器和客户端之间的网络。理想情况下,网络跟踪会非常有用