Probablemente me esté perdiendo algo obvio aquí.
Estoy usando los HttpClient
lanzamientos HttpRequestException
que contienen StatusCode
en la cadena de mensajes.
¿Cómo puedo acceder a eso StatusCode
?
Editar : Más información, escribí esta pregunta apresuradamente.
Estoy usando HttpClient
para 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 HttpRequestException
en el HttpResponseException
uso de personalización ExceptionFilterAttribute
.
Desafortunadamente, HttpRequestException
no contiene ninguna información adicional que pueda usar además del mensaje. Esperaba descubrir StatusCode
en 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
HttpRequestException
que no pueda recuperarlo solo de tales excepciones.El diseño de
System.Net.Http
requiere que acceda enHttpResponseMessage.StatusCode
lugar 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.InnerException
es 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