當Web服務器使用HTTP 304(未修改)響應HttpWebRequest.GetResponse()
時,GetResponse()
將刪除WebException
,這對我來說非常奇怪。這是由設計還是我在這裏錯過了明顯的東西?HttpWebRequest.GetResponse在HTTP上拋出WebException 304
回答
好吧,這似乎是一個設計行爲和vexing exception完美的例子。這可以用這個來解決:
public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
try
{
return (HttpWebResponse) request.GetResponse();
}
catch (WebException ex)
{
if(ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
throw;
return (HttpWebResponse)ex.Response;
}
}
這真是一個令人沮喪的問題,並且可以交替使用下面的擴展方法類和調用request.BetterGetResponse()
//-----------------------------------------------------------------------
//
// Copyright (c) 2011 Garrett Serack. All rights reserved.
//
//
// The software is licensed under the Apache 2.0 License (the "License")
// You may not use the software except in compliance with the License.
//
//-----------------------------------------------------------------------
namespace CoApp.Toolkit.Extensions {
using System;
using System.Net;
public static class WebRequestExtensions {
public static WebResponse BetterEndGetResponse(this WebRequest request, IAsyncResult asyncResult) {
try {
return request.EndGetResponse(asyncResult);
}
catch (WebException wex) {
if(wex.Response != null) {
return wex.Response;
}
throw;
}
}
public static WebResponse BetterGetResponse(this WebRequest request) {
try {
return request.GetResponse();
}
catch (WebException wex) {
if(wex.Response != null) {
return wex.Response;
}
throw;
}
}
}
}
你讀圍繞工作更多關於它在對這個問題我的博客文章在http://fearthecowboy.com/2011/09/02/fixing-webrequests-desire-to-throw-exceptions-instead-of-returning-status/
的方式來避免這種System.WebException
是 AllowAutoRedirect屬性設置爲false
。 這會禁用WebRequest
的自動重定向邏輯。對於304重定向請求來說,它似乎被破壞了,因爲它並不是最嚴格意義上的真正重定向。 當然,這意味着其他重定向請求3xx
必須手動處理。
絕對的輝煌。如果我不需要它,爲什麼我應該爲強力異常機器支付費用? – jsuddsjr 2017-11-03 18:47:08
我也碰到這個問題,代碼:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
Log.Error("Unknown error occured", ex);
//throw;
}
,看來,如果遠程服務器拋出這個錯誤或返回定製304返回304個狀態必須被傳遞給瀏覽器,以便瀏覽器可以返回緩存響應。否則,您可能會收到來自遠程服務器的空響應。
所以在我的情況下,與正確的緩存處理正常的行爲應該是這樣的:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotModified)
throw;
Log.Error("Unknown error occured", ex);
}
正如一個供參考,這是使用C#6(VS2015)when
子句Anton Gogolev's answer更新。使用調試器時,它會少一點惱人,因爲它會刪除一個檢查點:
public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
try
{
return (HttpWebResponse) request.GetResponse();
}
catch (WebException ex)
when (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
{
return (HttpWebResponse) ex.Response;
}
}
- 1. HttpWebRequest.GetResponse()拋出WebException
- 2. HttpWebRequest.GetResponse()拋出untrappable錯誤
- 3. Ftp僅在.NET 4.0中拋出WebException
- 4. HTTPWebRequest.GetResponse()拋出連接失敗的例外
- 5. 我得到WebException:「操作已超時」立即在HttpWebRequest.GetResponse()
- 6. HttpWebRequest .GetResponse拋出WebException'操作已超時'
- 7. 如何獲取拋出WebException的URI?
- 8. GetResponse拋出WebException並且ex.Response爲空
- 9. S3客戶PutObjectRequest拋出引發WebException
- 10. Amazon GetSessionToken拋出:拋出狀態爲TrustFailure的WebException
- 11. HttpListener - 如何向瀏覽器發送WebException HTTP 304「未修改」錯誤?
- 12. 禁用304 HTTP tomcat
- 13. 代碼拋出WebException在.NET 3.5中工作,但不在4.0中
- 14. WebException:單出TimeoutExceptions
- 15. FireBase在第一輪循環後拋出WebException 400
- 16. 在WinRT應用程序中拋出的WebException不能被捕獲
- 17. 爲什麼FtpWebRequest恰恰在長傳輸結束時拋出WebException?
- 18. HttpWebRequest.GetResponse()拋出「錯誤的請求」 400錯誤
- 19. 角$ http和狀態碼304
- 20. 句柄狀態304 AngularJS $ HTTP
- 21. YQL使用限制 - HTTP 304
- 22. HTTP 200發生2次HTTP 304
- 23. 當.NET拋出WebException((400)錯誤請求)時如何處理WebResponse?
- 24. .NET拋出引發WebException,而不是設置的StatusCode
- 25. Xamarin表單https與客戶端證書拋出WebException
- 26. httpwebrequest.getResponse超時在webservice
- 27. WebException在讀取WebException的響應流時
- 28. TidHTTPClient上代碼304
- 29. 澤西島/ JAX-RS客戶端在HTTP上拋出異常GET
- 30. HTTP 405應用程序在Apache Tomcat上拋出的錯誤
這適用於大多數情況,但某些Web服務器在返回404錯誤時可能會返回響應主體。在這種情況下,上面的代碼會將404視爲對待304! – comshak 2010-01-07 20:50:36
@comshak這是一個「很好的瞭解」。調用代碼必須知道什麼是可接受的響應代碼。 – roufamatic 2011-07-06 21:42:22
我也加了'|| ((HttpWebResponse)ex.Response).StatusCode!= HttpStatusCode.NotModified' – 2013-11-25 08:03:08