Uso de ASP.NET Core con HTTP/2 en IIS

Por Justin Kotalik

HTTP/2 es compatible con ASP.NET Core en los escenarios de implementación de IIS siguientes:

  • Windows 2016 o posterior; Windows 10 o posterior
  • IIS 10 o posterior
  • Conexión con TLS 1.2 o una versión posterior
  • Al hospedar fuera del proceso: Las conexiones de servidor perimetral de acceso público usan HTTP/2, pero la conexión de proxy inverso al servidor de Kestrel usa HTTP/1.1.

Para una implementación dentro del proceso cuando se establece una conexión HTTP/2, HttpRequest.Protocol notifica HTTP/2. Para una implementación fuera del proceso cuando se establece una conexión HTTP/2, HttpRequest.Protocol notifica HTTP/1.1.

Para obtener más información sobre los modelos de hospedaje en proceso y fuera de proceso, consulte Módulo ASP.NET Core.

HTTP/2 está habilitado de forma predeterminada para las conexiones HTTPS/TLS. Las conexiones vuelven a HTTP/1.1 si no se establece una conexión HTTP/2. Para más información sobre la configuración HTTP/2 con implementaciones de IIS, vea HTTP/2 en IIS.

Características avanzadas de HTTP/2 para admitir gRPC

Las características adicionales de HTTP/2 en IIS admiten gRPC, incluida la compatibilidad con los finalizadores de respuesta y el envío de marcos de restablecimiento.

Requisitos para ejecutar gRPC en IIS:

  • Hospedaje dentro del proceso.
  • Windows 10, compilación del sistema operativo 20300.1000 o posterior. Puede requerir el uso de una compilación para Windows Insider.
  • Conexión con TLS 1.2 o una versión posterior

Clips finales

Los finalizadores HTTP son similares a los encabezados HTTP, salvo que se envían después de enviar el cuerpo de la respuesta. Para IIS y HTTP.sys, solo se admiten los finalizadores de respuesta HTTP/2.

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

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

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

En el código de ejemplo anterior:

  • SupportsTrailers garantiza que los finalizadores se admitan para la respuesta.
  • DeclareTrailer agrega el nombre del finalizador dado al encabezado de respuesta Trailer. Declarar los finalizadores de una respuesta es opcional, pero se recomienda. Si se llama a DeclareTrailer, debe ser antes de que se envíen los encabezados de respuesta.
  • AppendTrailer anexa el finalizador.

Reset

Un restablecimiento permite que el servidor restablezca una solicitud HTTP/2 con un código de error especificado. Una solicitud de restablecimiento se considera una anulación.

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

En el ejemplo de código anterior, Reset especifica el código de error de INTERNAL_ERROR. Para obtener más información sobre los códigos de error HTTP/2, visite la sección de código de error de especificación de HTTP/2.