2010-10-07 78 views
8

我正嘗試使用C#4.0中的WebRequest類下載頁面。出於某種原因,此頁面將正確返回所有內容,但帶有HTTP 500內部錯誤代碼。C#HttpWebRequest忽略HTTP 500錯誤

Request.EndGetResponse(ar); 

當頁面返回HTTP 500或404時,此方法拋出WebException。我怎麼能忽略這個?我知道它返回500,但我仍然想讀取頁面/響應的內容。

回答

0

使用try/catch塊,讓您的計劃,以確保即使拋出異常運行:

try 
{ 
    Request.EndGetResponse(ar); 
} 
catch (WebException wex) 
{ 
    // Handle your exception here (or don't, to effectively "ignore" it) 
} 

// Program will continue to execute 
7
try { 
    resp = rs.Request.EndGetResponse(ar); 
} 
catch (WebException ex) 
{ 
    resp = ex.Response as HttpWebResponse; 
} 
20

您可以在try/catch塊捕獲異常並做額外的處理通過查看WebExeption類公開的響應對象,發現http 404或500錯誤。

try 
{ 
    response = (HttpWebResponse)Request.EndGetResponse(ar); 
} 
catch (System.Net.WebException ex) 
{ 
    response = (HttpWebResponse)ex.Response; 

    switch (response.StatusCode) 
    { 
     case HttpStatusCode.NotFound: // 404 
      break; 

     case HttpStatusCode.InternalServerError: // 500 
      break; 

     default: 
      throw; 
    } 
} 
0

問題是由於未將瀏覽器詳細信息發送到請求網站。 您需要向您要求數據的網站標識自己。

簡單的一個用戶代理添加到您的代碼

request.UserAgent = 「Mozilla的/ 5.0(Windows NT的6.1; WOW64; RV:2.0)的Gecko/20100101火狐/ 4.0」;

最終代碼應該是這個樣子:

HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(http://WEBURL); 
Request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0"; 
try 
{ 
response = (HttpWebResponse)Request.EndGetResponse(ar); 
} 
catch (System.Net.WebException ex) 
{ 
response = (HttpWebResponse)ex.Response; 

switch (response.StatusCode) 
{ 
    case HttpStatusCode.NotFound: // 404 
     break; 

    case HttpStatusCode.InternalServerError: // 500 
     break; 

    default: 
     throw; 
} 
} 

請找到參考/證明上面的代碼中提到: https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

這是在鏈接

提到「

」默認情況下,WebClient實例不會發送可選的HTTP標頭。如果您的請求需要選項nal標題,您必須將標題添加到Headers集合。例如,要在響應中保留查詢,您必須添加一個用戶代理標題。此外,如果用戶代理標題丟失,服務器可能會返回500(內部服務器錯誤)。「