如何从HttpRequestException获取StatusCode?
我可能在这里丢失了一些明显的东西
我正在使用HttpClient
抛出包含StatusCode
在消息string中的HttpRequestException
。
我怎样才能访问StatusCode
?
编辑 :更多信息,我急于写这个问题。
我正在使用HttpClient
来访问我的WebApi项目中的另一个API。 是的,我知道我为什么要调用EnsureSuccessStatusCode()
。 我想传播下游的一些错误,如404和403。
我只想要使用自定义的ExceptionFilterAttribute
一致地将HttpRequestException
转换为HttpResponseException
。
不幸的是,除了消息之外, HttpRequestException
不会携带任何额外的信息。 我希望能够以raw(int或enum)forms发现StatusCode
。
看起来我可以:
- 使用该信息切换状态码(bleh)
- 或创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
- 用这里解释的自定义exception扩展HttpResponseMessage
- 在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)