我们有一个在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参数是正确的,几乎就像内容流没有被刷新一样。
我们怀疑微软更新导致了这个问题。可能KB970430,KB971737和KB968389。该问题似乎与IIS 5.x(IIS版本的IIS)隔离。
答案 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上运行的版本)的一个问题。