Sử dụng ASP.NET Core với HTTP/2 trên IIS
Tác giả: Justin Kotalik
HTTP/2 (phiên bản giao thức HTTP thứ hai) được hỗ trợ với ASP.NET Core trong các kịch bản triển khai IIS (Internet Information Services) sau đây:
- Windows Server 2016 trở lên / Windows 10 trở lên
- IIS 10 trở lên
- Kết nối TLS (Transport Layer Security) 1.2 trở lên
- Khi hosting out-of-process: Các kết nối từ máy chủ edge (cạnh) hướng ra ngoài sử dụng HTTP/2, nhưng kết nối reverse proxy (proxy ngược) tới máy chủ Kestrel sử dụng HTTP/1.1.
Đối với triển khai in-process (trong tiến trình) khi kết nối HTTP/2 được thiết lập, HttpRequest.Protocol báo cáo HTTP/2. Đối với triển khai out-of-process (ngoài tiến trình) khi kết nối HTTP/2 được thiết lập, HttpRequest.Protocol báo cáo HTTP/1.1.
Để biết thêm thông tin về các mô hình hosting in-process và out-of-process, xem ASP.NET Core Module (ANCM) for IIS.
HTTP/2 được bật mặc định cho các kết nối HTTPS/TLS. Các kết nối sẽ trở về HTTP/1.1 nếu kết nối HTTP/2 không được thiết lập. Để biết thêm thông tin về cấu hình HTTP/2 với các triển khai IIS, xem HTTP/2 on IIS.
Các tính năng HTTP/2 nâng cao để hỗ trợ gRPC
Các tính năng HTTP/2 bổ sung trong IIS hỗ trợ gRPC (Google Remote Procedure Call), bao gồm hỗ trợ trailers (phần đuôi) của phản hồi và gửi các khung reset.
Yêu cầu để chạy gRPC trên IIS:
- Hosting in-process.
- Windows 11 Build 22000 trở lên, Windows Server 2022 Build 20348 trở lên.
- Kết nối TLS 1.2 trở lên.
Trailers (Phần đuôi phản hồi)
HTTP Trailers tương tự như HTTP Headers (tiêu đề HTTP), ngoại trừ việc chúng được gửi sau khi phần thân phản hồi đã được gử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 ví dụ code 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 tiêu đề phản hồiTrailer. Khai báo trailers của một 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 tiêu đề phản hồi được gửi đi.AppendTrailernối thêm trailer.
Reset (Đặt lại)
Reset cho phép máy chủ đặt lại yêu cầu HTTP/2 với một mã lỗi cụ thể. Một yêu cầu bị reset được coi là đã bị hủy bỏ.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>(); resetFeature.Reset(errorCode: 2);
Reset trong ví dụ code trên chỉ định mã lỗi INTERNAL_ERROR. Để biết thêm thông tin về các mã lỗi HTTP/2, xem phần mã lỗi trong đặc tả HTTP/2.