如何从HttpRequestException获取StatusCode?

Kug*_*gel 67 c# httpexception dotnet-httpclient

我可能在这里遗漏了一些明显的东西.

我正在使用Message字符串中包含的HttpClient哪个throws .HttpRequestExceptionStatusCode

我该如何访问StatusCode


编辑:更多信息,我急着写这个问题.

我正在使用HttpClient我的WebApi项目中的另一个API.是的,我知道我为什么打电话EnsureSuccessStatusCode().我想在下游传播一些错误,例如404和403.

我想要的只是不断变换HttpRequestExceptionHttpResponseException使用自定义ExceptionFilterAttribute.

不幸的是,HttpRequestException除了消息之外,我没有携带任何额外的信息.我希望以StatusCode原始(int或enum)形式发现.

看起来我可以:

  1. 使用该消息切换状态代码(bleh)
  2. 或者创建我的EnsureSuccessStatusCode版本并抛出实际可用的异常.

Lex*_* Li 28

状态代码作为字符串的一部分传递给HttpRequestException您,因此您无法仅从这些异常中恢复它.

设计System.Net.Http要求您访问HttpResponseMessage.StatusCode而不是等待异常.

http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx

如果您现在正在关注Microsoft指南,请确保清楚地了解它要求您致电的原因HttpResponseMessage.EnsureSucessStatusCode.如果你不调用该函数,则不应该有异常.

  • 这就引出了一个显而易见的问题:便捷方法抛出异常而无法有效地处理错误的根本意义是什么?用if和throw语句乱扔代码不是解决方案,因此从这里所说的看,当前看来正确的答案是您必须自己重新实现便捷方法或sureSuccessStatusCode。 (3认同)
  • 说起来容易做起来难。第三方代码可以引发异常。例如自动生成的 swagger 客户端。 (3认同)
  • 我在这里试图解决一个跨领域的问题。看我的编辑,也许有更好的解决方案。 (2认同)
  • 这是否适合 HttpClient.GetStreamAsync(url) 的使用,因为我看不到无需删除消息文本即可执行此操作的方法? (2认同)

Ste*_*eve 22

值得一提的是,这家伙做得很聪明:https: //social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception最远程的名字吗?论坛= csharpgeneral

在我需要异常状态属性的情况下,我可以这样做:

catch (HttpRequestException requestException)
{
    if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 因为有时你无法访问响应,就像你被迫使用包装功能的库并抛出任何异常一样. (11认同)
  • 运行 .NET Core 3.1.5,`requestException.InnerException` 为 null,所以这不起作用 (5认同)
  • .net核心2.1 HttpClient具有GetAsync()和GetStreamAsync()。第一个将返回响应,而另一个将在内部调用sureSucessStatusCode并抛出HttpRequestException。我不理解这种不一致,这使处理错误变得困难,但是我感谢这种解决方法。 (3认同)

Tan*_*jel 6

也许我来晚了:

从 .NET 5.0 开始, HttpRequestException具有一个StatusCode属性,如果异常表示不成功的结果,则该属性将具有一个值,否则为 null。所以你可以使用如下:

try
{
   // Your code
}
catch (HttpRequestException httpRequestException)
{
   if ((int)httpRequestException.StatusCode == 401)
   {
        // Show unauthorized error message
   }
   else 
   {
       // Other error message
   }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请点击此处