Probablemente me esté perdiendo algo obvio aquí.
Estoy usando los HttpClientlanzamientos HttpRequestExceptionque contienen StatusCodeen la cadena de mensajes.
¿Cómo puedo acceder a eso StatusCode?
Editar : Más información, escribí esta pregunta apresuradamente.
Estoy usando HttpClientpara acceder a otra API dentro de mi proyecto WebApi. Sí, sé por qué llamo EnsureSuccessStatusCode(). Quiero propagar algunos errores en sentido descendente, como 404 y 403.
Todo lo que quería era transformarme constantemente HttpRequestExceptionen el HttpResponseExceptionuso de personalización ExceptionFilterAttribute.
Desafortunadamente, HttpRequestExceptionno contiene ninguna información adicional que pueda usar además del mensaje. Esperaba descubrir StatusCodeen forma cruda (int o enum).
Parece que puedo:
- Use el mensaje para cambiar el código de estado (bleh)
- O cree mi versión de SecureSuccessStatusCode y lance una excepción que sea realmente útil.

Respuestas:
El código de estado se pasó como parte de una cadena para
HttpRequestExceptionque no pueda recuperarlo solo de tales excepciones.El diseño de
System.Net.Httprequiere que acceda enHttpResponseMessage.StatusCodelugar de esperar la excepción.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Si ahora está siguiendo la guía de Microsoft , asegúrese de comprender claramente por qué le pide que llame
HttpResponseMessage.EnsureSucessStatusCode. Si no llama a esa función, no debería haber ninguna excepción.fuente
Por lo que vale, este tipo hizo algo inteligente: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception-the-remote-name? forum = csharpgeneral
En el caso de que necesite una propiedad de estado de excepción, puedo hacer esto:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }fuente
requestException.InnerExceptiones nula, por lo que esto no funcionaráComo también lo mencionaron otros, no es una buena práctica obtener el StatusCode de HttpRequestException, lo mismo se puede hacer de antemano con HttpResponseMessage.StatusCode después de verificar HttpResponseMessage.IsSuccessStatusCode
De todos modos, si debido a alguna restricción / requisito, uno tiene que leer StatusCode, puede haber dos soluciones
A continuación se muestra el código en System.Net.Http.HttpResponseMessage donde SR.net_http_message_not_success_statuscode = "El código de estado de respuesta no indica éxito: {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; }fuente
Esto ha funcionado para mi
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)fuente