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

Jam*_*mes 13 .net asp.net exception httpwebrequest

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

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

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

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

谢谢你的帮助

dgi*_*oni 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);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...


Dar*_*rov 5

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

由于语法格式错误,服务器无法理解请求.客户端不应该在没有修改的情况下重复请求.

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

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

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