2010-10-07 45 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(内部服务器错误)。“