.net httprequest system.net

.net - El uso de InsuranceSuccessStatusCode y el manejo de HttpRequestException lo arroja



system.net (3)

¿Cuál es el patrón de uso de HttpResponseMessage.EnsureSuccessStatusCode() ? Se deshace del Contenido del mensaje y se lanza la HttpRequestException , pero no veo cómo manejarlo mediante programación de forma diferente a una Exception genérica. Por ejemplo, no incluye el HttpStatusCode , que habría sido útil.

¿Hay alguna manera de obtener más información de ella? ¿Alguien podría mostrar un patrón de uso relevante de ambos, EnsureSuccessStatusCode() y HttpRequestException?


El uso idiomático de EnsureSuccessStatusCode es verificar de manera concisa el éxito de una solicitud, cuando no desea manejar los casos de falla de una manera específica. Esto es especialmente útil cuando desea crear un prototipo rápido de un cliente.

Cuando decida que quiere manejar los casos de falla de una manera específica, no haga lo siguiente.

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

Esto lanza una excepción solo para atraparla inmediatamente, lo cual no tiene ningún sentido. La propiedad IsSuccessStatusCode de HttpResponseMessage está ahí para este propósito. Haga lo siguiente en su lugar.

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


No me gusta el código de estado de verificaciónSuccess ya que no devuelve nada significativo. Por eso he creado mi propia extensión:

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

El código fuente para el InsuranceSuccessStatusCode de Microsoft se puede encontrar here

Versión síncrona basada en el enlace SO :

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

Lo que no me gusta de IsSuccessStatusCode es que no es "bien" reutilizable. Por ejemplo, puede usar la biblioteca como polly para repetir una solicitud en caso de un problema de red. En ese caso, necesita que su código genere una excepción para que polly o alguna otra biblioteca pueda manejarlo ...


Sé que esta no es la mejor manera de hacerlo, pero estoy usando así:

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

Por favor, hágame saber si tiene alguna solución mejor.