2010-04-23 83 views
12

當然,當然,有一種方法可以配置.Net HttpWebRequest對象,以便在調用HttpWebRequest.GetResponse()時不會引發異常,並且任何返回300或400個狀態碼?如何停止.Net HttpWebRequest.GetResponse()引發異常

Jon Skeet does not think so,所以我幾乎不敢問,但我覺得很難相信這是沒有辦法解決的。在某些情況下,300和400響應碼是有效的響應。爲什麼我們總是被迫招致異常的開銷?

也許有一些模糊的配置設置可以避開Jon Skeet?也許有一種完全不同類型的請求對象可以使用,但沒有這種行爲?

(是的,我知道你可以抓住異常並從中得到迴應,但我想找到一種不必須的方式)。

感謝您的幫助

回答

5

根據該規範,當服務器發送400個狀態代碼就意味着:

由於語法錯誤

請求不能由 服務器來理解。 客戶端不應該重複 請求沒有修改。

所以在這種情況下看起來很自然。就300而言,這更具爭議性。

無論如何,如果你想要一些非標準的行爲,你總是可以求助於TcpClient,但這真的看起來像是一個極端和絕望的措施。

您是否執行過性能測試?你是否確認拋出異常例外是你的應用程序的瓶頸?在這種情況下,它似乎是一個微型優化。難道你不能通過僞造一個有效的請求讓這個Web服務器很快樂,並最終獲得200個?如果不是,你不能切換到更標準的Web服務器?

+0

嗨達林 感謝您的回覆。你說得很好。我覺得例外(由於他們的費用)應該是可選的,並且很驚訝沒有辦法規避這種情況。你的解決方法是好主意。我將進一步調查...... – James 2010-04-26 14:00:43

+0

我同意並且重要的網絡服務通常會返回400和500狀態代碼來向服務呼叫報告無效輸入。在很多情況下,這些都不是錯誤。例如,我們從某個Web服務返回的400個狀態代碼只是爲了表明沒有可用的記錄 - 儘管這不是一個錯誤。響應的主體仍然是json,並給我們留言。所以我同意這將是理想的關閉例外,這就是爲什麼我和其他許多人正在尋找這篇文章。 – 2016-04-21 00:29:35

1

將HttpWebRequest上的AllowAutoRedirect屬性設置爲false將停止服務器發送300狀態碼時引發的異常。

儘管如此,它並不能阻止404狀態碼拋出異常。

9

如果你想要從4XX錯誤的錯誤反應,你可以做這樣的:

HttpWebResponse res = null; 
string response = string.Empty; 
StreamReader sr = null; 
Stream resst = null; 
try 
{ 
    res = (HttpWebResponse)req.GetResponse(); 
    resst = res.GetResponseStream(); 
    sr = new StreamReader(resst); 
    response = sr.ReadToEnd(); 
} 
catch (WebException exception) 
{ 
    HttpWebResponse errorResponse = (HttpWebResponse)exception.Response; 
    resst = errorResponse.GetResponseStream(); 
    sr = new StreamReader(resst); 
    response = sr.ReadToEnd(); 
} 
this.Response.Write(response); 

希望這有助於...

+0

這個答案http://stackoverflow.com/a/2676411/671619說相反。誰是對的? – Firo 2012-03-02 14:44:55

+1

我剛剛在獲得400後運行該代碼,它會在響應中返回預期的錯誤細節。 – rob 2013-03-08 15:38:06

+1

請注意,[WebException.Response可能爲空](https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Net.WebException.Response%29;k% 28TargetFrameworkMoniker-.NETFramework)。 – 2015-02-04 03:19:08