Dot-Net
如何停止 .Net HttpWebRequest.GetResponse() 引發異常
當然,當然,肯定有一種方法可以配置 .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);希望這可以幫助…