Использование ASP.NET Core с HTTP/2 в службах IIS

Автор Джастин Коталик (Justin Kotalik)

HTTP/2 поддерживается в ASP.NET Core для следующих сценариев развертывания IIS:

  • Windows Server 2016 или более поздней версии либо Windows 10 или более поздней версии
  • Службы IIS 10 или более поздней версии
  • Подключение TLS 1.2 или более поздней версии
  • Размещение вне процесса. Подключения к пограничным серверам, открытым для общего доступа, выполняются по протоколу HTTP/2, а подключение к серверу Kestrel через обратный прокси-сервер — по протоколу HTTP/1.1.

При внутрипроцессном развертывании и установленном подключении HTTP/2 HttpRequest.Protocol возвращает HTTP/2. При внепроцессном развертывании и установленном подключении HTTP/2 HttpRequest.Protocol возвращает HTTP/1.1.

Дополнительные сведения о внутри- и внепроцессных моделях размещения см. в статье Модуль ASP.NET Core (ANCM) для IIS.

Протокол HTTP/2 включен по умолчанию для соединений по HTTPS/TLS. Если не удается установить подключение HTTP/2, применяется резервный вариант HTTP/1.1. Дополнительные сведения о настройке HTTP/2 для развертываний IIS см. в статье об HTTP/2 в IIS.

Расширенные возможности HTTP/2 для поддержки gRPC

Дополнительные возможности HTTP/2 в службах IIS поддерживают gRPC, включая трейлеры ответов и отправку кадров сброса.

Требования для выполнения gRPC в службах IIS

  • Внутрипроцессное размещение.
  • Windows 11 сборки 22000 или более поздней, Windows Server 2022 сборки 20348 или более поздней.
  • Подключение TLS 1.2 или более поздней версии.

Трейлеры

Трейлеры HTTP похожи на заголовки HTTP, за исключением того, что они отправляются после отправки текста ответа. Для IIS и HTTP.sys поддерживаются только трейлеры ответов HTTP/2.

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername");	

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

В приведенном выше примере кода:

  • SupportsTrailers обеспечивает поддержку трейлеров для ответа;
  • DeclareTrailer добавляет заданное имя трейлера в заголовок ответа Trailer. Объявлять трейлеры ответа необязательно, но рекомендуется. Вызов DeclareTrailer должен производиться перед отправкой заголовков ответа.
  • AppendTrailer добавляет трейлер.

Reset

Сброс позволяет серверу сбросить запрос HTTP/2 с указанным кодом ошибки. Сброшенный запрос считается прерванным.

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

Reset в предыдущем примере кода задает код ошибки INTERNAL_ERROR. Дополнительные сведения о кодах ошибок HTTP/2 см. в соответствующем разделе спецификации HTTP/2.