如何阻止.Net HttpWebRequest.GetResponse()引发异常

时间:2010-04-23 21:29:03

标签: .net asp.net exception httpwebrequest

当然,肯定有一种方法可以配置.Net HttpWebRequest对象,以便在调用HttpWebRequest.GetResponse()并返回任何300或400状态代码时不会引发异常?

Jon Skeet does not think so,所以我几乎不敢问,但我发现很难相信没有办法解决这个问题。在某些情况下,300和400响应代码是有效的响应。为什么我们总是被迫承担例外的开销呢?

也许有一些模糊的配置设置逃避了Jon Skeet?也许有一种完全不同类型的请求对象可以使用但没有这种行为?

(是的,我知道你可以抓住异常并从中得到答案,但我想找到一种不必要的方法)。

感谢您的帮助

4 个答案:

答案 0 :(得分:12)

如果您想从4xx错误中检索错误响应,可以这样做:

HttpWebResponse res = null;
string response = string.Empty;
StreamReader sr = null;
Stream resst = null;
try
{
    res = (HttpWebResponse)req.GetResponse();
    resst = res.GetResponseStream();
    sr = new StreamReader(resst);
    response = sr.ReadToEnd();
}
catch (WebException exception)
{
    HttpWebResponse errorResponse = (HttpWebResponse)exception.Response;
    resst = errorResponse.GetResponseStream();
    sr = new StreamReader(resst);
    response = sr.ReadToEnd();
}
this.Response.Write(response);

希望这会有所帮助......

答案 1 :(得分:5)

根据规范,当服务器发送400状态代码时,意味着:

  

请求无法理解   由于语法错误导致的服务器。   客户端不应该重复   请求不加修改。

所以在这种情况下看起来很自然。就300而言,它更值得商榷。

无论如何,如果你想要一些非标准的行为,你总是可以诉诸TcpClient,但这似乎是一种极端和绝望的措施。

您是否进行过性能测试?您是否确认在此例外案例中抛出异常是您的应用程序的瓶颈?在这种情况下,这似乎是微优化。难道你不能通过伪造一个有效的请求并最终得到200来使这个Web服务器满意吗?如果没有,你不能切换到更标准的Web服务器?

答案 2 :(得分:5)

答案 3 :(得分:1)

将HttpWebRequest上的AllowAutoRedirect属性设置为false将停止在服务器发送300状态代码时抛出异常。

但它不会阻止404状态代码抛出异常。