2014-01-07 69 views
1

快速的問題。 HttpClient在404錯誤中拋出異常,但從請求返回的404頁實際上對我的應用程序有用。是否可以忽略404響應並將請求處理爲200?HttpClient - 忽略404

+2

我沒有看到提到使用.NET 4.5的HttpClient的問題? –

+0

請注意我沒有使用ASP.NET。這是一個WinForms應用程序。 –

+0

它看起來像你可能必須實現你自己的[httpmessagehandler](http://msdn.microsoft.com/en-us/library/system.net.http.httpmessagehandler(v = vs.110).aspx) – rene

回答

0

主機名解析失敗與向已知主機請求不存在文檔的情況不同,後者必須單獨處理。我懷疑你正面臨解決方案失敗(因爲它會拋出,而向已知主機請求不存在的資源不會拋出,但會給你一個很好的「NotFound」響應)。

下面的代碼片段處理這兩種情況下:

// urls[0] known host, unknown document 
// urls[1] unknown host 
var urls = new string[] { "http://www.example.com/abcdrandom.html", "http://www.abcdrandom.eu" }; 
using (HttpClient client = new HttpClient()) 
{ 
    HttpResponseMessage response = new HttpResponseMessage(); 
    foreach (var url in urls) 
    { 
     Console.WriteLine("Attempting to fetch " + url); 
     try 
     { 
      response = await client.GetAsync(url); 

      // If we get here, we have a response: we reached the host 
      switch (response.StatusCode) 
      { 
       case System.Net.HttpStatusCode.OK: 
       case System.Net.HttpStatusCode.NotFound: { /* handle 200 & 404 */ } break; 
       default: { /* whatever */ } break; 
      } 
     } 
     catch (HttpRequestException ex) 
     { 
      //kept to a bare minimum for shortness 
      var inner = ex.InnerException as WebException; 
      if (inner != null) 
      { 
       switch (inner.Status) 
       { 
        case WebExceptionStatus.NameResolutionFailure: { /* host not found! */ } break; 
        default: { /* other */ } break; 
       } 
      } 
     } 
    } 
} 

WebExceptionStatus枚舉包含許多種可能的故障(包括Unknown)的代碼來處理。

+0

404通常會引發異常,因此無法達到switch語句。不是100%確定是否在HttpClient中存在相同的行爲 – MichaelD

+0

在404上沒有引發異常,但是根本不能發送請求:即,您得到了名稱解析失敗(我懷疑是這種情況)的異常。我將更新代碼 – Alex

+1

找不到服務器上的頁面時引發異常。這是發生了什麼事。 –

1

您可以使用流從異常別人的

WebClient client = new WebClient(); 
try 
{ 
    client.DownloadString(url); 
} 
catch (System.Net.WebException exception) 
{ 
    string responseText; 

    using (var reader = new System.IO.StreamReader(exception.Response.GetResponseStream())) 
    { 
     responseText = reader.ReadToEnd(); 
     throw new Exception(responseText); 
    } 
} 

禮貌讀取404的內容,但我無法找到在那裏我得到這個信息源