【问题标题】:HttpRequestException vs WebExceptionHttpRequestException 与 WebException
【发布时间】:2014-03-13 14:50:55
【问题描述】:

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

我是新手,但它们之间有什么区别?为什么有两种类型?什么时候使用一个而不是另一个?

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

编辑: 我正在使用HttpClient。具体调用client.GetStreamAsync()

【问题讨论】:

  • 您应该添加抛出的代码(这样人们就可以知道您使用的是 WebClient、HttpClient 还是其他一些类)
  • 抱歉,我使用的是 HttpClient。专门调用client.GetStreamAsync()。但我更感兴趣的是一般地了解它是如何工作的,而不是试图解决特定的代码问题,所以我不想用太多代码来混淆它。

标签: c# rest dotnet-httpclient webexception


【解决方案1】:

有三种不同的失败场景:

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

b) 在读/写网络流时,如果出现某种中断,你会得到一个 IOException。

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

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

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

【讨论】:

【解决方案2】:

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

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

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


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

【讨论】:

  • 是的,HttpRequestException 有时是一个 WebException——它应该可以让您访问状态。
  • 我看到了 MSDN 定义,但这并不能真正解释它,或者我在这方面不够精明,无法理解它试图告诉我的细微差别。就我而言,HttpRequestException 不是 WebException,也不是任何 InnerException。
  • @PeterRitchie 我相信 WebException 不应该出现在 HttpClient 中,除非作为 HttpRequestException 或 IOException 的内部异常。
  • @DarrelMiller 重新阅读我的评论,我并不清楚......这就是我想说的; HttpRequestException 有时会包装一个 WebException——这将提供对 HttpStatusCode 的访问。
  • @PeterRitchie 除非是 EnsureSuccessStatusCode 抛出 HttpRequestException,在这种情况下没有 WebException,或者当 WebException 与连接失败有关,在这种情况下也没有状态码。
【解决方案3】:

https://github.com/dotnet/runtime/pull/32455 在 .NET 5 中将 StatusCode 添加到 HttpRequestException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多