Comment puis-je obtenir StatusCode à partir de HttpRequestException?

je suis probablement en train de rater quelque chose d'évident ici.

j'utilise HttpClient qui lance HttpRequestException qui contient StatusCode dans la chaîne de messages.

Comment puis-je accéder à ce StatusCode ?


modifier : plus d'info, j'ai écrit cette question dans rush.

j'utilise HttpClient pour accéder à une autre API dans mon projet WebApi. Oui, J' sachez pourquoi j'appelle EnsureSuccessStatusCode() . Je veux propager quelques erreurs en aval comme 404 et 403.

Tout ce que je voulais, c'était transformer systématiquement HttpRequestException en HttpResponseException en utilisant la coutume 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éer ma version de EnsureSuccessStatusCode et jeter l'exception qui est réellement utilisable.
46
demandé sur Hakam Fostok 2014-03-06 11:13:32

4 réponses

Le code de statut

a été passé en tant que partie d'une chaîne de caractères à HttpRequestException de sorte que vous ne pouvez pas le récupérer de telles exceptions seulement.

le dessin de System.Net.Http exige que vous accédiez à HttpResponseMessage.StatusCode au lieu d'attendre l'exception.

http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage (v=V110).aspx

si vous suivez maintenant le guide de Microsoft , assurez-vous de bien comprendre pourquoi il vous demande d'appeler HttpResponseMessage.EnsureSucessStatusCode . Si vous n'appelez pas cette fonction, il ne devrait pas y avoir d'exception.

23
répondu Lex Li 2017-06-16 08:45:18

pour ce que ça vaut, ce type a fait quelque chose d'intelligent: 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

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)requestException.InnerException).Status == WebExceptionStatus.NameResolutionFailure)
    {
        return true;
    }

    return false;
}
13
répondu Steve 2016-08-10 20:24:13

comme mentionné par d'autres aussi ce n'est pas une bonne pratique d'obtenir le StatusCode à partir de HttpRequestException, la même chose peut être faite à l'avance avec HttpResponseMessage.StatusCode après avoir vérifié le message HttpResponseMessage.Issuccesssstatuscode

de toute façon si en raison d'une contrainte / exigence on doit lire StatusCode, Il peut y avoir deux solutions

  1. a étendu le message de réponse avec votre exception personnalisée expliquée ici
  2. Hack sur la HttpRequestException.ToString pour obtenir le StatusCode, Que le message est une constante poste fixe par StatusCode et Repharse.

ci-dessous le code dans le système.Net.Http.Httprespondemessage 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
répondu Surender Singh Malik 2017-05-23 12:02:22

cela a fonctionné pour moi

var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
1
répondu Rastislav Bodorik 2016-11-22 12:11:12