No me gusta GuaranteeSuccessStatusCode 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 SecureSuccessStatusCode de Microsoft se puede encontrar aquí.
Versión sincrónica 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 "agradablemente" reutilizable. Por ejemplo, puede usar una biblioteca como polly para repetir una solicitud en caso de un problema de red. En ese caso, necesita su código para generar una excepción para que polly o alguna otra biblioteca pueda manejarlo ...