2009-12-17 31 views
0

我們有一個在IIS中運行的ASP.NET Web應用程序,它使用SoapHttpClientProtocol類來進行SOAP調用。在最近幾天,幾個XP機器在進行SOAP服務調用時已經開始報告超時錯誤。來自IIS 5.1(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 /跟蹤和Wireshark我們可以看到,請求的報頭中被髮送而不是內容。但是,內容長度HTTP參數是正確的,就好像內容流沒有被刷新一樣。

我們懷疑Microsoft更新導致了此問題。可能,KB971737KB968389。該問題似乎與IIS 5.x(IIS的XP版本)隔離。

回答

0

UPDATE:事實證明,這是ESET殺毒軟件在Web服務器上運行並執行從Web服務器到SOAP服務器的HTTP連接執行實時檢查的問題。

完整描述:爲了記錄這是在HTTP協議處理在.NET中的缺陷。該方案是如下:

客戶端發送的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 

的內容,因爲期望的不發送:100繼續。服務器現在響應:

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上運行的版本)的一個問題。

+0

「WebRequest」中存在一些錯誤http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds 2011-01-03 18:17:35