web-dev-qa-db-fra.com

Comment puis-je obtenir StatusCode de HttpRequestException?

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:

  1. Utilisez le message pour changer le code d'état (bleh)
  2. Ou créez ma version de EnsureSuccessStatusCode et lève une exception réellement utilisable.
63
Kugel

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.

27
Lex Li

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;
}
21
Steve

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.

  1. Extension de HttpResponseMessage avec votre exception personnalisée expliquée ici
  2. Hack sur le HttpRequestException.ToString pour obtenir le StatusCode, Comme le message est une publication constante fixée par StatusCode et Repharse.

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;
    }
3

Cela a fonctionné pour moi

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