Мне не нравится EnsureSuccessStatusCode, поскольку он не возвращает ничего значимого. Поэтому я создал собственное расширение:
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;
}
}
исходный код для Microsoft EnsureSuccessStatusCode можно найти здесь
Синхронная версия на основе ссылки 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);
}
Что мне не нравится в IsSuccessStatusCode, так это то, что его нельзя "красиво" повторно использовать. Например, вы можете использовать библиотеку наподобие polly, чтобы повторить запрос в случае проблем с сетью. В этом случае вам нужно, чтобы ваш код генерировал исключение, чтобы polly или какая-либо другая библиотека могла его обработать ...