Nguon: Microsoft Learn · .NET 8.0

Thoát Request (Request Draining) với máy chủ web Kestrel trong ASP.NET Core

Nguồn: Request draining with ASP.NET Core Kestrel web server

Việc mở kết nối HTTP tốn thời gian. Với HTTPS, nó còn tốn tài nguyên. Do đó, Kestrel cố gắng tái sử dụng kết nối theo giao thức HTTP/1.1. Phần thân của request phải được đọc đầy đủ để cho phép kết nối được tái sử dụng. Ứng dụng không phải lúc nào cũng tiêu thụ phần thân của request, chẳng hạn như các request HTTP POST mà server trả về redirect (chuyển hướng) hoặc phản hồi 404. Trong trường hợp HTTP POST redirect:

Quá trình thoát thực hiện sự đánh đổi giữa việc cho phép kết nối được tái sử dụng và thời gian cần thiết để thoát hết dữ liệu còn lại:

Đôi khi bạn có thể muốn chấm dứt request ngay lập tức, trước hoặc sau khi ghi phản hồi. Ví dụ, client có thể có giới hạn dữ liệu nghiêm ngặt. Giới hạn dữ liệu được tải lên có thể là ưu tiên. Trong những trường hợp như vậy để chấm dứt request, hãy gọi HttpContext.Abort từ controller, Razor Page, hoặc middleware.

Có một số lưu ý khi gọi Abort:

Gọi HttpResponse.CompleteAsync trước khi gọi Abort đảm bảo rằng server đã hoàn thành việc ghi phản hồi. Tuy nhiên, hành vi của client không thể đoán trước và client có thể không đọc phản hồi trước khi kết nối bị hủy.

Quá trình này khác với HTTP/2 vì giao thức hỗ trợ hủy bỏ các luồng request riêng lẻ mà không đóng kết nối. Timeout thoát năm giây không áp dụng. Nếu có bất kỳ dữ liệu phần thân request chưa đọc nào sau khi hoàn thành phản hồi, thì server gửi một HTTP/2 RST frame. Các data frame phần thân request bổ sung bị bỏ qua.

Nếu có thể, tốt hơn cho client nên sử dụng header request Expect: 100-continue và chờ server phản hồi trước khi bắt đầu gửi phần thân request. Điều đó cho client cơ hội kiểm tra phản hồi và hủy bỏ trước khi gửi dữ liệu không cần thiết.