2011-09-04 226 views
2

我有一個ASP.NET Web服務,當我偶爾調用它時,它會返回正確的響應,其他時候它會返回異常The request failed with HTTP status 401: OK.有人可以請我提供一些原因,會發生?由於我無法在HTTP 401上找到任何內容,並且出現OK的消息,因爲200是正常的,而且401是未授權的...爲什麼我的Web服務在IIS6中託管會返回?什麼原因導致「HTTP狀態401:確定」

這裏的直接異常詳細信息:

Message: 
    The request failed with HTTP status 401: OK. 
Stack Trace: 
    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) 
    at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 
    at ws.Main.MethodName(param1, param2) 

我會試圖讓這個錯誤是Wireshark數據包跟蹤,當我隨其提供的。

客戶端和Web服務都是我們維護的代碼。該異常只是間歇性發生,並非總是如此,通過的憑證詳細信息是帳戶的有效AD用戶詳細信息,而IIS網站使用的是Windows身份驗證。

+1

當收到401時,請求發出時請求的Web服務的數據是否存在?它可能是Web服務中的一個「bug」,或者Web服務無法找到請求的數據,並返回[401而不是404](http://stackoverflow.com/questions/4038981/)爲了安全起見,或者它可能完全是其他的東西,它可以返回-http-401-for-a-non-existant-resource-404-to-preve) – Zabba

+0

我收到非常零星的401:未經授權,所以這個問題引起了我的注意。你是否從服務中捕獲異常細節?您是否有權訪問服務器以查看事件查看器中是否有信息?我也試圖得到一個分析器,所以我很好奇你發現了什麼。您使用哪種綁定和安全模式? – McArthey

+0

問題是我們看到這個401確定有時會返回,即使方法代碼只是在另外一個空方法中返回True。正如我現在在我更新的問題中所說的,客戶端和Web服務都是我們維護的代碼。 – Seph

回答

2

我找到了原因並得到了答案。

這個問題是由多個線程在同一個TCP管道上同時訪問WebService引起的。這導致IIS重置身份驗證握手,結果應用程序收到HTTP 401 UNAUTHORIZED例外代替200 OK消息,.NET報告響應爲HTTP 401 OK,但是使用WireShark我能夠確定內容仍然是HTTP 401 UNAUTHORIZED

由於問題的多線程性質,我們曾經非常間歇地發生這種情況。

解決方案是編寫一個新的代理類,它包含我們自動生成的ws代理類(來自WSDL)並在此新代理類中的每個方法上實現一個SYNCLOCK對象。

當我使用服務器名稱而不是DNS名稱時,問題似乎也消失了,因爲每個單獨的線程調用都在不同的TCP管道上。

0

401表示您正嘗試訪問受密碼保護的資源,而不在請求中包含任何驗證信息。檢查你沒有錯誤配置你的服務器,要求爲返回響應的URL提供密碼,並檢查所有請求是否在同一個域中:你可能無意中向密碼保護域發出請求(我已經舉了一個例子過去看到的是使用單獨的主機來提供靜態文件,但靜態文件虛擬主機具有HTTP基本身份驗證設置)。

0

401未授權

到403故宮相似,但專爲使用在認證 是可能的,但發生故障或尚未提供。

這意味着您沒有對您嘗試訪問的資源的權限,並且認證可能會有所作爲。我不認爲OK是相對的,雖然它是不尋常的。檢查actual Http Status code in Fiddler以確保。

相反:

403禁止

請求是合法的請求,但服務器拒絕迴應 它。與401未經授權的響應不同,身份驗證不會產生 的差異。

服務農場?它可能是一臺服務器配置不正確。

根據你最近的評論,你應該檢查沒有資源泄漏導致意外的行爲。如果您使用數據庫確保您正在處理一次性對象等,請配置服務器以監視內存使用情況。考慮異步服務以保持線程池可用,如果您有長時間運行的請求。檢查事件日誌。

認爲我可能也有類似的行爲,當IIS不能處理已認證的流量,它只是彈了一個401我從來沒有注意到確定,但很可能發生在這種情況下。

+0

服務在單個服務器上沒有農場。它很好地工作很長時間然後一個呼叫說1000將失敗,但接下來的10,000將工作正常,然後在100失敗3次等(數字僅供參考)..我幾乎認爲問題是廣告花太長的時間回覆..但最重要的問題是爲什麼它是'401 OK'而不是'401 Unauthorized'... 401確實沒有意義嗎? – Seph

+0

更新了一些更多的想法。 – TheCodeKing

相關問題