Мені не подобається 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;
}
}
Вихідний код для EnsureSuccessStatusCode від Microsoft можна знайти тут
Синхронна версія на основі 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 або якась інша бібліотека могла з цим впоратися ...