这是一个我很困惑的一般性问题。我认为一旦发出REST请求,就会通过WebException
返回错误。在一个案例中,我得到一个HttpRequestException
,这不允许我获取HTTP状态代码。
我对这些东西不熟悉,但这些之间的区别是什么?为什么有两种类型?什么时候使用而不是另一个?
WebException
似乎运作良好。 HttpRequestException
似乎是它的一个非常弱的版本,它知道状态代码(在它的消息中),但它不会明确告诉我它是什么。
修改
我正在使用HttpClient
。专门致电client.GetStreamAsync()
。
答案 0 :(得分:12)
有三种不同的故障情况:
a)您无法连接到服务器或代理,在这种情况下会抛出HttpRequestException。请注意,如果您的服务器已关闭并且您正在运行fiddler,您将永远不会看到此异常,您将获得5XX状态代码。
b)读取/写入网络流时,会出现某种中断,您将收到IOException。
c)您将获得带有4XX / 5XX状态代码的HttpStatusCode的响应。如果您的客户端应用程序选择调用response.EnsureSuccessStatusCode(),则会抛出HttpRequestException。
如果您决定调用EnsureSuccessStatusCode,那么您明确表示您不关心状态代码,除了它是成功/失败的事实。
如果你真的需要冒出异常然后处理状态代码,那么我建议你创建自己的扩展方法来替换EnsureSuccessStatusCode并创建自己的异常来存储状态代码。或者最好根据您希望采取的纠正措施将状态代码转换为少数几种异常中的一种。
答案 1 :(得分:1)
WebException Class:通过可插拔协议访问网络时发生错误时引发的异常。
HttpRequestException Class:HttpClient和HttpMessageHandler类抛出异常的基类。
我认为HttpRequestException的内部异常可能是WebException但是我不确定它是不是。
注意,404,302或200(OK)以外的任何响应不异常。这些响应是完全有效的HTTP响应。
答案 2 :(得分:0)
https://github.com/dotnet/runtime/pull/32455将StatusCode
添加到.NET 5中的HttpRequestException
。