Nie podoba mi się RememberSuccessStatusCode, ponieważ nie zwraca nic sensownego. Dlatego stworzyłem własne rozszerzenie:
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;
}
}
kod źródłowy dla programu GuaranteeSuccessStatusCode firmy Microsoft można znaleźć tutaj
Wersja synchroniczna oparta na łączu 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);
}
To, co mi się nie podoba w IsSuccessStatusCode, to fakt, że nie można go „ładnie” ponownie wykorzystać. Na przykład możesz użyć biblioteki takiej jak Polly, aby powtórzyć żądanie w przypadku problemu z siecią. W takim przypadku potrzebujesz kodu do zgłaszania wyjątku, aby Polly lub inna biblioteka mogła go obsłużyć ...