Đồng hồ bấm giây có thể ngừng chờ trong khi yêu cầu HTTP vẫn đang tiếp diễn. Hãy trao quyền hủy cho chính thao tác khi một lần thử qua proxy có ngân sách thời gian định trước.

Với một ứng dụng .NET hiện đại đã có HttpClient được cấu hình proxy:

using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var response = await client.GetAsync(
    targetUrl,
    HttpCompletionOption.ResponseHeadersRead,
    budget.Token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(budget.Token);

Cùng một ngân sách bắt đầu trước bước chuẩn bị và vẫn hiệu lực khi đọc body. ResponseHeadersRead trả quyền điều khiển sau phần header, nên thời gian chờ riêng của HttpClient không tự nó định ra ngân sách cho lần đọc body về sau.

Giữ việc hủy tách biệt khỏi trạng thái HTTP và lỗi truyền tải. OperationCanceledException có thể đến từ token được truyền vào hoặc từ một thời gian chờ khác đã cấu hình; hãy kiểm tra nguồn hủy tương ứng thay vì báo mọi thất bại là proxy chết.

Tái sử dụng chính client sở hữu tuyến proxy này. Hủy một lần thử không có nghĩa là phải dựng lại toàn bộ nhóm kết nối cho mọi yêu cầu sau đó.

Ví dụ đệm body phản hồi có kích thước hữu hạn. Khi tải xuống theo luồng, cần truyền token qua vòng lặp sao chép luồng và giải phóng phản hồi trên mọi đường thoát.

Hủy thể hiện chính sách của thao tác, không phải lời hứa thời gian chính xác cho mọi hành động nền tảng. Đừng thay nó bằng vòng lặp thăm dò vô tận trên Task.IsCompleted.

Bài viết liên quan