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:
SupportsTrailersgarantiza que los finalizadores se admitan para la respuesta.DeclareTraileragrega el nombre del finalizador dado al encabezado de respuestaTrailer. Declarar los finalizadores de una respuesta es opcional, pero se recomienda. Si se llama aDeclareTrailer, debe ser antes de que se envíen los encabezados de respuesta.AppendTraileranexa 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.