Sử dụng HTTP/2 với máy chủ web Kestrel trong ASP.NET Core
HTTP/2 khả dụng cho các ứng dụng ASP.NET Core nếu đáp ứng các yêu cầu cơ bản sau:
- Hệ điều hành:
- Windows Server 2016/Windows 10 trở lên‡
- Linux với OpenSSL 1.0.2 trở lên (ví dụ: Ubuntu 16.04 trở lên)
- macOS 10.15 trở lên
- Target framework (framework mục tiêu): .NET Core 2.2 trở lên
- Kết nối Application-Layer Protocol Negotiation (ALPN)
- Kết nối TLS 1.2 trở lên
‡Kestrel có hỗ trợ giới hạn cho HTTP/2 trên Windows Server 2012 R2 và Windows 8.1. Hỗ trợ bị giới hạn vì danh sách các cipher suite (bộ mã hóa) TLS được hỗ trợ trên các hệ điều hành này có hạn. Có thể cần một chứng chỉ được tạo bằng Elliptic Curve Digital Signature Algorithm (ECDSA) để bảo mật kết nối TLS.
Nếu kết nối HTTP/2 được thiết lập, HttpRequest.Protocol sẽ báo cáo HTTP/2.
Bắt đầu từ .NET Core 3.0, HTTP/2 được bật theo mặc định. Để biết thêm thông tin về cấu hình, xem phần Kestrel HTTP/2 limits và ListenOptions.Protocols.
Các tính năng HTTP/2 nâng cao
Các tính năng HTTP/2 bổ sung trong Kestrel hỗ trợ gRPC, bao gồm hỗ trợ response trailers (đoạn cuối phản hồi) và gửi reset frames (khung đặt lại).
Trailers
HTTP Trailers (đoạn cuối HTTP) tương tự như HTTP Headers (tiêu đề HTTP), ngoại trừ chúng được gửi sau khi body của phản hồi được gửi đi. Đối với IIS và HTTP.sys, chỉ HTTP/2 response trailers được hỗ trợ.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}Trong đoạn mã ví dụ trên:
SupportsTrailersđảm bảo rằng trailers được hỗ trợ cho phản hồi.DeclareTrailerthêm tên trailer đã cho vào response headerTrailer. Khai báo trailers của phản hồi là tùy chọn nhưng được khuyến nghị. NếuDeclareTrailerđược gọi, nó phải được gọi trước khi response headers được gửi đi.AppendTrailerthêm trailer vào phản hồi.
Reset
Reset (đặt lại) cho phép máy chủ đặt lại một yêu cầu HTTP/2 với một mã lỗi được chỉ định. Một yêu cầu bị đặt lại được coi là đã bị hủy bỏ (aborted).
var resetFeature = httpContext.Features.Get<IHttpResetFeature>(); resetFeature.Reset(errorCode: 2);
Reset trong ví dụ mã trên chỉ định mã lỗi INTERNAL_ERROR. Để biết thêm thông tin về mã lỗi HTTP/2, hãy truy cập phần mã lỗi trong đặc tả HTTP/2.