Dot-Net

如何停止 .Net HttpWebRequest.GetResponse() 引發異常

  • October 6, 2014

當然,當然,肯定有一種方法可以配置 .Net HttpWebRequest 對象,以便在呼叫 HttpWebRequest.GetResponse() 並返回任何 300 或 400 狀態程式碼時它不會引發異常?

Jon Skeet不這麼認為,所以我幾乎不敢問,但我很難相信沒有辦法解決這個問題。在某些情況下,300 和 400 響應程式碼是有效的響應。為什麼我們總是被迫承擔異常的成本?

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

(是的,我知道您可以擷取異常並從中獲得響應,但我想找到一種不必這樣做的方法)。

謝謝你的幫助

根據規範,當伺服器發送 400 狀態碼時,這意味著:

由於語法錯誤,伺服器無法理解該請求。客戶端不應該在沒有修改的情況下重複請求。

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

無論如何,如果你想要一些非標準的行為,你總是可以求助於TcpClient但這似乎是一種極端和絕望的措施。

您是否進行了性能測試?您是否確認在這種異常情況下拋出異常是您的應用程序的瓶頸?在這種情況下,這似乎是一種微優化。你不能通過偽造一個有效的請求並在最後得到 200 來讓這個 Web 伺服器滿意嗎?如果不是,您不能切換到更標準的 Web 伺服器嗎?

如果要從 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);

希望這可以幫助…

引用自:https://stackoverflow.com/questions/2702090