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?
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
}
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...
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.