我有一个奇怪的问题。让我在下面一步一步详细解释:
我有一个供应商开发了 REST WS(使用 WCF 制作)用于与 MS CRM 同步数据。
我开发了一个 Windows 服务,它从数据库中获取要同步的批次数据,然后使用 Post 方法将其作为 JSON 对象传递给这个 Web 服务。Windows 服务部署在其中一个节点上。
我面临的问题从未在 Dev、QA、UAT 或暂存环境中发生。它仅适用于生产环境。
在生产中,应用程序工作了一段时间,然后开始抛出 400 Bad request 错误。然后,直到我们重新启动站点或重置应用程序池标识,IIS 一直抛出 400 Bad request 错误。当我们重新启动站点或应用程序池时,失败的相同请求开始获得成功的响应。它可以像这样工作一段时间,然后再开始发生 400 次。
托管 Web 服务的环境是 Win Server 2012,2 节点负载平衡环境。WS 部署在两个节点的 8080 端口上,并配置为在 .Net 4.0 下运行。
我在作为这些 WS 客户端的 Windows 服务日志中收到以下错误。
System.Net.WebException:远程服务器返回错误:(400)错误请求。在 CrmWrapperWsHelper.cs 中的 SspToCrmSynchronizationService.Helpers.CrmWrapperWsHelper.CallService(字符串数据,字符串 url,字符串方法,字符串用户名,字符串密码,字符串 contentType):CrmWrapperWsHelper.cs 中 SspToCrmSynchronizationService.Helpers.CrmWrapperWsHelper.CallDocumentCreateService(字符串数据)的第 79 行:CommonOperations.cs 中 SspToCrmSynchronizationService.Process.CommonOperations.GenerateJsonAndInvokeDocCreateWS(Int64 appRefNo, Application app) 的第 20 行:SspToCrmSynchronizationService.Process.SequentialProcess.Process(List`1 appList, DatabaseHelper dbHelperForChildTask, CancellationToken ct) 中 SequentialProcess.cs 的第 52 行:第 88 行
首先,我们检查了 IIS 日志,发现 IIS 在短短 100 毫秒内就返回了 400 错误。我们怀疑它没有到达 WS 应用程序,因为应用程序根本没有记录任何东西,尽管记录请求是供应商在 WS 代码中做的第一件事。
其次,我们使用 Fiddler 来捕获请求和响应,得到以下信息:
HTTP/1.1 400 Bad Request Cache-Control: private Content-Length: 1647 Content-Type: text/html Server: Microsoft-IIS/8.5 X-ASpNet-Version: 4.0.30319 X-Powered-By: ASP.Net Date: Tue, 17 Oct 2017 07:14:26 GMT
- 我们检查了 IIS Httperr.log。在日志中,我们发现了一些请求的以下内容,而不是每个失败的请求。似乎什么都没有。
2017-07-07 03:32:45 10.102.2.52 63726 10.102.2.52 8080 - - - - - Timer_ConnectionIdle -
2017-07-08 22:46:55 10.102.2.52 50916 10.102.2.52 8080 - - - - - Timer_Idle 2017-07-08 22:55:09 10.102.2.52 51004 10.102.2.52 8080 - - - - - Timer_ConnectionIdle -
- 比我们在 IIS 中将 Failed Traced Log 配置为 400 并在抛出此 400 错误时在跟踪日志中得到一个警告。由于保密协议和安全原因,我已经从图像中删除了一些数据。
基本上,警告详细信息如下:
124. MODULE_SET_RESPONSE_ERROR_STATUS ModuleName="ManagedPipelineHandler", Notification="EXECUTE_REQUEST_HANDLER", HttpStatus="400", HttpReason="Bad Request", HttpSubStatus="0", ErrorCode="The operation completed successfully. (0x0)", ConfigExceptionInfo=""
- 之后,我比较了一个错误案例和一个成功案例。下面是图片。
我不知道是什么导致了这个(根本原因)以及如何解决这个问题以及为什么它最初可以工作而一段时间后无法工作。任何帮助将不胜感激。