17

这是一个我很困惑的普遍问题。我认为一旦发出 REST 请求,错误就会通过WebException. 在一种情况下,我得到了一个HttpRequestException,它不允许我获取 HTTP 状态代码。

我是这个东西的新手,但是这些有什么区别?为什么有两种类型?什么时候使用一个而不是另一个?

WebException似乎运作良好。HttpRequestException似乎是它的一个非常弱的版本,它知道状态代码(在它的消息中),但它不会明确告诉我它是什么。

编辑: 我正在使用HttpClient. 专门调用client.GetStreamAsync().

4

3 回答 3

19

存在三种不同的故障情况:

a) 您无法连接到服务器或代理,在这种情况下会抛出 HttpRequestException。请注意,如果您的服务器已关闭并且您正在运行 fiddler,您将永远不会看到此异常,您将获得 5XX 状态代码。

b) 当读/写网络流时,有某种中断你会得到一个 IOException。

c) 您将收到带有 4XX/5XX 状态代码的 HttpStatusCode 的响应。如果您的客户端应用程序选择调用 response.EnsureSuccessStatusCode(),则会抛出 HttpRequestException。

如果您决定调用 EnsureSuccessStatusCode,您将做出一个明确的决定,即您不关心状态代码,除了它是成功/失败的事实。

如果您确实需要冒泡一个异常,然后再处理状态码,那么我建议您创建自己的扩展方法来替换 EnsureSuccessStatusCode 并创建自己的可以存储状态码的异常。或者最好根据您希望采取的纠正措施将状态代码转换为几个不同的异常之一。

于 2014-03-24T13:56:05.363 回答
2

WebException Class:通过可插拔协议访问网络时发生错误时引发的异常。

HttpRequestException 类:HttpClient 和 HttpMessageHandler 类引发的异常的基类。

我认为 HttpRequestException 的内部异常可能是 WebException 但我不确定它是否曾经是。


请注意,404、302 或除 200(OK)以外的任何响应也不例外。这些响应是完全有效的 HTTP 响应。

于 2014-03-13T14:57:09.400 回答
0

https://github.com/dotnet/runtime/pull/32455添加StatusCodeHttpRequestException.NET 5。

于 2020-12-04T09:59:39.757 回答