我有一个奇怪的问题。让我在下面一步一步详细解释:
我有一个供应商开发了 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=""
- 之后,我比较了一个错误案例和一个成功案例。下面是图片。
我不知道是什么导致了这个(根本原因)以及如何解决这个问题以及为什么它最初可以工作而一段时间后无法工作。任何帮助将不胜感激。
我们需要了解它是如何工作的,有很多错误:
我们在 JSON 中传递了一个日期时间值。在 WS 端,当尝试将 DateTime 字段传递给应用程序的 WS 容器(IIS 和 WCF)在进行转换时失败时,DateTime 值会引发一些解析错误。我相信这可能是由于语言环境。我们通过将日期时间更改为 WS 接受的 JSON 中的字符串来修复它。
第二个问题是我们的供应商使用 WCF 作为一种技术来创建 Rest API。WCF 的一种行为是,如果来自客户端的请求导致 WS 容器中发生致命异常,则 IIS 将在阻止列表中注册该客户端,并且在 IIS 重新启动完成之前不会将来自该客户端的请求转发到应用程序。IIS 将不断向我们返回错误请求状态消息。