【问题标题】:C# HttpWebRequest ignore HTTP 500 errorC# HttpWebRequest 忽略 HTTP 500 错误
【发布时间】:2017-03-10 22:34:15
【问题描述】:
我正在尝试使用 C#4.0 中的 WebRequest 类下载页面。由于某种原因,此页面正确返回所有内容,但带有 HTTP 500 内部错误代码。
Request.EndGetResponse(ar);
当页面返回 HTTP 500 或 404 时,此方法会引发 WebException。我怎么能忽略这个?我知道它返回 500 但我仍然想阅读页面/响应的内容。
【问题讨论】:
标签:
c#-4.0
httpwebrequest
【解决方案1】:
您可以通过查看 WebExeption 类公开的响应对象,使用 try / catch 块来捕获异常并在 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;
}
}
【解决方案2】:
try {
resp = rs.Request.EndGetResponse(ar);
}
catch (WebException ex)
{
resp = ex.Response as HttpWebResponse;
}
【解决方案3】:
使用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
【解决方案4】:
问题是由于没有将浏览器详细信息发送到请求站点。
您需要向请求数据的网站表明自己的身份。
简单地将用户代理添加到您的代码中
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/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 标头。如果您的请求需要可选标头,则必须将标头添加到 Headers 集合中。例如,要在响应中保留查询,您必须添加用户-代理标头。此外,如果缺少用户代理标头,服务器可能会返回 500(内部服务器错误)。”