Tôi không thích EnsureSuccessStatusCode vì nó không trả về bất kỳ thứ gì ít ỏi. Đó là lý do tại sao tôi đã tạo tiện ích mở rộng của riêng mình:
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;
}
}
có thể tìm thấy mã nguồn cho EnsureSuccessStatusCode của Microsoft tại đây
Phiên bản đồng bộ dựa trên liên kết 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);
}
Điều tôi không thích về IsSuccessStatusCode là nó không thể tái sử dụng một cách "độc đáo". Ví dụ: bạn có thể sử dụng thư viện như polly để lặp lại một yêu cầu trong trường hợp mạng có vấn đề. Trong trường hợp đó, bạn cần mã của mình để tăng ngoại lệ để polly hoặc một số thư viện khác có thể xử lý nó ...