Utilisation de Ensuresuccesssstatuscode et manipulation de HttpRequestException qu'il lance

Quelle est l'utilisation de HttpResponseMessage.EnsureSuccessStatusCode() ? Il dispose du contenu du message et lance HttpRequestException , mais je ne vois pas comment le traiter programmatiquement autrement qu'un Exception Générique . Par exemple , il ne comprend pas le HttpStatusCode , qui aurait été pratique.

Est-il possible d'obtenir plus d'informations? Est-ce que quelqu'un pourrait montrer un profil d'utilisation pertinent de EnsureSuccessStatusCode() et de HttpRequestException?

63
demandé sur G. Stoynev 2014-01-13 21:34:54

3 réponses

l'usage idiomatique de EnsureSuccessStatusCode est de vérifier de façon concise le succès d'une requête, lorsque vous ne voulez pas traiter les cas d'échec de manière spécifique. Ceci est particulièrement utile lorsque vous voulez rapidement prototype d'un client.

lorsque vous décidez que vous voulez traiter les cas de défaillance d'une manière spécifique, ne pas faire ce qui suit.

var response = await client.GetAsync(...);
try
{
    response.EnsureSuccessStatusCode();
    // Handle success
}
catch (HttpRequestException)
{
    // Handle failure
}

cela jette une exception juste pour l'attraper immédiatement, ce qui ne fait pas sens. Le IsSuccessStatusCode bien de HttpResponseMessage est là pour cette fin. Procédez de la manière suivante à la place.

var response = await client.GetAsync(...);
if (response.IsSuccessStatusCode)
{
    // Handle success
}
else
{
    // Handle failure
}
87
répondu Timothy Shields 2015-01-16 22:30:33

Je n'aime pas Ensuresuccesssstatuscode car il ne rend rien meaninful. C'est pourquoi j'ai créé ma propre extension:

public static class HttpResponseMessageExtensions
{
    public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response)
    {
        if (response.IsSuccessStatusCode)
        {
            return;
        }

        var content = await response.Content.ReadAsStringAsync();

        if (response.Content != null)
            response.Content.Dispose();

        throw new SimpleHttpResponseException(response.StatusCode, content);
    }
}

public class SimpleHttpResponseException : Exception
{
    public HttpStatusCode StatusCode { get; private set; }

    public SimpleHttpResponseException(HttpStatusCode statusCode, string content) : base(content)
    {
        StatusCode = statusCode;
    }
}

code source de Microsoft EnsureSuccessStatusCode peut être trouvé ici

version synchrone basée sur so link :

public static void EnsureSuccessStatusCode(this HttpResponseMessage response)
{
    if (response.IsSuccessStatusCode)
    {
        return;
    }

    var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

    if (response.Content != null)
        response.Content.Dispose();

    throw new SimpleHttpResponseException(response.StatusCode, content);
}

ce que je n'aime pas chez Issuccesssstatuscode c'est qu'il n'est pas" bien " réutilisable. Pour exemple vous pouvez utiliser une bibliothèque comme polly pour répéter une requête en cas de problème réseau. Dans ce cas, vous avez besoin de votre code pour soulever exception afin que polly ou une autre bibliothèque peut le gérer...

59
répondu pajics 2017-08-08 21:29:38

je sais que ce n'est pas la meilleure façon de le faire mais j'utilise comme ceci:

try
{
    ...
}
catch (HttpRequestException exception)
{
    if (exception.Message.Contains("401 (Unauthorized)"))
    {
        statusCode = HttpStatusCode.Unauthorized;
    }
    else if (exception.Message.Contains("403 (Forbidden)"))
    {
        statusCode = HttpStatusCode.Forbidden;
    }
}

faites-moi savoir si vous avez la meilleure solution.

1
répondu B.J. 2018-07-20 12:03:41