如何停止 .Net HttpWebRequest.GetResponse() 抛出异常

13

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

Jon Skeet 并不这样认为,因此我几乎不敢问,但我很难相信没有办法解决这个问题。在某些情况下,300和400响应代码是有效的响应。为什么我们总是被迫遭受异常的开销呢?

也许有一些晦涩的配置设置逃过了Jon Skeet的注意?也许有一种完全不同类型的请求对象可以使用,它没有这种行为?

(是的,我知道你可以捕获异常并从中获取响应,但我想找到一种不必这样做的方法)。

感谢任何帮助

4个回答

13

如果你想从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);

希望这可以帮到你...


这个答案 https://dev59.com/inRB5IYBdhLWcg3wLk1M#2676411 给出了相反的说法。哪一个是正确的? - Firo
1
我刚刚在收到400后运行了那段代码,它确实在响应中返回了预期的错误细节。 - rob
1
请注意,WebException.Response 可能为空 - Oliver Bock

6
根据规范,当服务器发送400状态码时,它表示:
请求由于格式不正确而无法被服务器理解。客户端不应该在没有修改的情况下重复请求。
因此,在这种情况下出现异常看起来很自然。至于300,则更具有争议性。
无论如何,如果您想要一些非标准行为,您总是可以使用TcpClient,但那似乎是一种极端和不得已的措施。
您进行了性能测试吗?您确认在这种异常情况下抛出异常是应用程序的瓶颈吗?在这种情况下,这似乎是微小的优化。您不能通过伪造有效请求并在最后获得200来使这个Web服务器满意吗?如果不能,您不能切换到更标准的Web服务器吗?

嗨Darin,感谢您的回复。您提出了很好的观点。我认为异常(由于它们的开销)应该是可选的,并且很惊讶没有办法规避这种情况。您的解决方法是很好的想法。我将进一步调查... - James
我同意,而且重要的是,Web服务通常返回400和500状态码来报告服务调用中的无效输入。在许多情况下,这些不是错误。例如,我们从某个Web服务返回400状态码只是为了指示没有可用记录-虽然这不是错误。响应正文仍然是带有消息的JSON。因此,我同意关闭异常是理想的,这就是为什么我和许多其他人正在找到这篇文章的原因。 - Action Dan
问题在于有时候响应的内容包含关于错误的关键调试信息(例如为什么会出现400),但是你在异常中无法获取到这些信息。 - Ohad Schneider


1

将HttpWebRequest的AllowAutoRedirect属性设置为false,可以防止服务器发送300状态码时抛出异常。

但是,它无法防止404状态码抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接