Je manque probablement quelque chose d'évident ici.
J'utilise HttpClient
qui jette HttpRequestException
qui contient StatusCode
dans la chaîne Message.
Comment puis-je accéder à cette StatusCode
?
Edit: Plus d'infos, j'ai écrit cette question dans Rush.
J'utilise HttpClient
pour accéder à une autre API de mon projet WebApi. Oui, je sais pourquoi j'appelle EnsureSuccessStatusCode()
. Je veux propager des erreurs en aval telles que 404 et 403.
Tout ce que je voulais, c'était de transformer systématiquement HttpRequestException
en HttpResponseException
à l'aide de custom ExceptionFilterAttribute
.
Malheureusement, HttpRequestException
ne contient aucune information supplémentaire que je pourrais utiliser en plus du message. J'espérais découvrir StatusCode
sous forme brute (int ou enum).
On dirait que je peux soit:
Le code d'état a été transmis en tant que partie d'une chaîne à HttpRequestException
afin que vous ne puissiez pas le récupérer uniquement à partir de telles exceptions.
Le design de System.Net.Http
vous oblige à accéder à HttpResponseMessage.StatusCode
au lieu d'attendre l'exception.
http://msdn.Microsoft.com/en-us/library/system.net.http.httpresponsemessage (v = vs.110) .aspx
Si vous suivez maintenant le guide Microsoft , assurez-vous de bien comprendre pourquoi il vous est demandé d'appeler HttpResponseMessage.EnsureSucessStatusCode
. Si vous n'appelez pas cette fonction, il ne devrait y avoir aucune exception.
Pour ce que ça vaut, ce gars a fait quelque chose d'intelligent: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemonsage-throws -exception-httprequestexception-webexception-the-remote-name? forum = csharpgeneral
Dans le cas où j'avais besoin d'une propriété de statut d'exception, je peux le faire:
catch (HttpRequestException requestException)
{
if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
{
return true;
}
return false;
}
Comme d'autres l'ont déjà mentionné, il n'est pas recommandé d'obtenir le StatusCode auprès de HttpRequestException. Vous pouvez également effectuer la même chose auparavant avec HttpResponseMessage.StatusCode après avoir vérifié HttpResponseMessage.IsSuccessStatusCode.
Quoi qu’il en soit, si, en raison de contraintes ou d’exigences, on doit lire StatusCode, il peut y avoir deux solutions.
Vous trouverez ci-dessous le code dans System.Net.Http.HttpResponseMessage Où SR.net_http_message_not_success_statuscode = "Le code d'état de la réponse n'indique pas le succès: {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;
}
Cela a fonctionné pour moi
var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)