我们有一个在 IIS 中运行的 ASP.NET Web 应用程序,它使用 SoapHttpClientProtocol 类进行 SOAP 调用。最近几天,几台 XP 计算机在进行 SOAP 服务调用时开始报告超时错误。

来自测试应用程序的堆栈跟踪:

System.Net.WebException: The operation has timed out
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at TestWS.localhost.Service1.HelloWorld() in C:\Prototypes\TestWS\Web References\localhost\Reference.cs:line 78
   at ASP.default_aspx.__Renderform1(HtmlTextWriter __w, Control parameterContainer) in c:\Inetpub\wwwroot\TestWS\Default.aspx:line 17

使用 TCP/Trace 和 Wireshark,我们可以看到正在发送请求的标头,但没有发送内容。但是,内容长度 HTTP 参数是正确的,几乎就像内容流尚未刷新一样。

我们怀疑 Microsoft 更新导致了此问题。潜在地 KB970430, KB971737KB968389. 。该问题似乎与 IIS 5.x(IIS 的 XP 版本)有关。

有帮助吗?

解决方案

更新: :事实证明,这是在 Web 服务器上运行的 ESET 防病毒软件以及对从 Web 服务器到 SOAP 服务器的 HTTP 连接执行动态检查时出现的问题。

详细描述: :根据记录,这是 .NET 中 HTTP 协议处理的缺陷。场景如下:

客户端发送 HTTP POST 标头:

POST /WS/Test.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603) 
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://testuri.org/HelloWorld"
Host: loadtest-app
Content-Length: 288
Expect: 100-continue
Connection: Keep-Alive

由于 Expect 原因,内容未发送:100-继续。服务器现在响应:

HTTP/1.1 100 Continue

此时客户端没有响应。解决此问题的一种解决方法是禁用 100-Continue,这实际上会强制请求标头和内容在一个块中发送。这可以在 web.config 中通过以下方式完成:

<system.net>
   <settings>
      <servicePointManager expect100Continue="false"/>
   </settings>
</system.net>

但是,如果我们还打开客户端跟踪日志记录,则会引发协议异常,指出 HTTP 标头中 CR 后应跟有 LF。.Net 网络逻辑中的某个地方似乎存在一些脆弱的代码。回顾一下,这只是 IIS 5.1(在 XP 上运行的版本)中的 ASP.NET 的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top