HttpRequestException vs WebException

use*_*281 14 c# rest webexception dotnet-httpclient

这是一个我很困惑的一般性问题.我认为一旦发出REST请求,就会通过一个错误返回错误WebException.在一个案例中,我得到了一个HttpRequestException,这不允许我获取HTTP状态代码.

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

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

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

Dar*_*ler 16

有三种不同的故障情形:

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

b)在读/写网络流时,会出现某种中断,您将获得IOException.

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

如果您决定调用EnsureSuccessStatusCode,那么您明确决定除了成功/失败之外不关心状态代码.

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

  • +1你遗忘的一件事是超时异常(这会引起混乱地抛出一个TaskCanceledException:http://social.msdn.microsoft.com/Forums/en-US/d8d87789-0ac9-4294-84a0-91c9fa27e353/bug-in- httpclientgetasync-应该抛出,引发WebException - 不taskcanceledexception?论坛= netfxnetcom) (7认同)

Ric*_*ick 3

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

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

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


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