来自IIS 5.1(XP)的SOAP服务调用超时

时间:2009-12-17 14:48:01

标签: .net iis soap tcptrace-pocketsoap

我们有一个在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参数是正确的,几乎就像内容流没有被刷新一样。

我们怀疑微软更新导致了这个问题。可能KB970430KB971737KB968389。该问题似乎与IIS 5.x(IIS版本的IIS)隔离。

1 个答案:

答案 0 :(得分:0)

更新:结果是在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-Continue,因此未发送内容。服务器现在响应:

HTTP/1.1 100 Continue

此时客户端没有回应。解决方法是禁用100-continue,这实质上强制请求标头和内容在一个块中发送。这可以在web.config中使用:

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

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