如何从HttpRequestException获取StatusCode?

我可能在这里丢失了一些明显的东西

我正在使用HttpClient抛出包含StatusCode在消息string中的HttpRequestException

我怎样才能访问StatusCode


编辑 :更多信息,我急于写这个问题。

我正在使用HttpClient来访问我的WebApi项目中的另一个API。 是的,我知道我为什么要调用EnsureSuccessStatusCode() 。 我想传播下游的一些错误,如404和403。

我只想要使用自定义的ExceptionFilterAttribute一致地将HttpRequestException转换为HttpResponseException

不幸的是,除了消息之外, HttpRequestException不会携带任何额外的信息。 我希望能够以raw(int或enum)forms发现StatusCode

看起来我可以:

  1. 使用该信息切换状态码(bleh)
  2. 或创build我的版本EnsureSuccessStatusCode并抛出实际可用的exception。

状态代码作为string的一部分传递给HttpRequestException因此您无法单独从这些exception中恢复。

System.Net.Http的devise要求您访问HttpResponseMessage.StatusCode而不是等待exception。

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

如果您现在正在遵循Microsoft指南 ,请确保您明白了解为什么它会要求您调用HttpResponseMessage.EnsureSucessStatusCode 。 如果你不调用这个函数,应该没有例外。

为了什么它的价值,这家伙做了巧妙的事情: https : //social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception最远程的名字吗?论坛= csharpgeneral

在我需要一个exception状态属性的情况下,我可以这样做:

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

正如其他人所提到的,从HttpRequestException获取StatusCode不是一个好习惯,在检查HttpResponseMessage.IsSuccessStatusCode之后,可以事先使用HttpResponseMessage.StatusCode完成相同的操作

无论如何,如果由于某种约束/要求必须读取StatusCode,可以有两个解决scheme

  1. 用这里解释的自定义exception扩展HttpResponseMessage
  2. 在HttpRequestException.ToString上获取StatusCode,因为消息是由StatusCode和Repharse修复​​的一个常量。

下面是System.Net.Http.HttpResponseMessage中的代码,其中SR.net_http_message_not_success_statuscode =“响应状态码不表示成功:{0}({1})”。

 public HttpResponseMessage EnsureSuccessStatusCode() { if (!this.IsSuccessStatusCode) { if (this.content != null) { this.content.Dispose(); } throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[] { (int)this.statusCode, this.ReasonPhrase })); } return this; } 

这对我有效

 var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)