Utilisation de EnsureSuccessStatusCode et gestion de HttpRequestException

Quel est le modèle d’utilisation de HttpResponseMessage.EnsureSuccessStatusCode() ? Il dispose du contenu du message et lève HttpRequestException , mais je ne vois pas comment le gérer par programmation différemment d’une Exception générique. Par exemple, il n’inclut pas le HttpStatusCode , ce qui aurait été pratique.

Existe-t-il un moyen d’obtenir plus d’informations? Quelqu’un pourrait-il afficher le modèle d’utilisation pertinent à la fois de EnsureSuccessStatusCode() et HttpRequestException?

L’utilisation idiomatique de EnsureSuccessStatusCode pour but de vérifier de manière concise le succès d’une requête, lorsque vous ne souhaitez gérer aucun cas d’échec de manière spécifique. Ceci est particulièrement utile lorsque vous souhaitez prototyper rapidement un client.

Lorsque vous décidez de gérer les incidents de manière spécifique, ne procédez pas comme suit.

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

Cela lance une exception simplement pour l’attraper immédiatement, ce qui n’a aucun sens. La propriété IsSuccessStatusCode de HttpResponseMessage est là pour cela. Procédez comme suit à la place.

 var response = await client.GetAsync(...); if (response.IsSuccessStatusCode) { // Handle success } else { // Handle failure } 

Je n’aime pas EnsureSuccessStatusCode car il ne renvoie rien de méchant. 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.ReadAsSsortingngAsync(); 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, ssortingng content) : base(content) { StatusCode = statusCode; } } 

le code source de EnsureSuccessStatusCode de Microsoft peut être trouvé ici

Version synchrone basée sur le lien SO :

 public static void EnsureSuccessStatusCode(this HttpResponseMessage response) { if (response.IsSuccessStatusCode) { return; } var content = response.Content.ReadAsSsortingngAsync().GetAwaiter().GetResult(); if (response.Content != null) response.Content.Dispose(); throw new SimpleHttpResponseException(response.StatusCode, content); } 

Ce que je n’aime pas avec IsSuccessStatusCode, c’est qu’il n’est pas “joliment” réutilisable. Par exemple, vous pouvez utiliser une bibliothèque comme polly pour répéter une demande en cas de problème de réseau. Dans ce cas, vous avez besoin de votre code pour générer une exception afin que polly ou une autre bibliothèque puisse 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; } } 

S’il vous plaît laissez-moi savoir si vous avez la meilleure solution.