Usar o ASP.NET Core com HTTP/2 no IIS

De Justin Kotalik

O HTTP/2 é compatível com ASP.NET Core nos seguintes cenários de implantação de IIS:

  • Windows Server 2016 ou posteriores / Windows 10 ou posteriores
  • IIS 10 ou posterior
  • Conexão TLS 1.2 ou posterior
  • Ao hospedar fora de processo: conexões de servidor de borda voltadas para o público usam HTTP/2, mas a conexão de proxy reverso para o Kestrel servidor usa HTTP/1.1.

Para uma implantação em processo quando uma conexão HTTP/2 for estabelecida, o HttpRequest.Protocol relatará HTTP/2. Para uma implantação fora do processo quando uma conexão HTTP/2 for estabelecida, o HttpRequest.Protocol relatará HTTP/1.1.

Para saber mais sobre os modelos de hospedagem dentro e fora do processo, consulte Módulo do ASP.NET Core (ANCM) para IIS.

O HTTP/2 está habilitado por padrão para conexões HTTPS/TLS. As conexões retornarão para HTTP/1.1 se uma conexão HTTP/2 não for estabelecida. Para obter mais informações sobre a configuração de HTTP/2 com implantações do IIS, consulte HTTP/2 no IIS.

Recursos HTTP/2 avançados para dar suporte a gRPC

Os recursos HTTP/2 adicionais no IIS dão suporte a gRPC, incluindo suporte para trailers de resposta e envio de quadros de redefinição.

Requisitos para executar gRPC no IIS:

  • Hospedagem em processo.
  • Windows 11 Build 22000 ou posterior, Windows Server 2022 Build 20348 ou posterior.
  • Conexão TLS 1.2 ou posterior.

Trailers

Os trailers HTTP são semelhantes aos cabeçalhos HTTP, exceto por serem enviados após o corpo da resposta ser enviado. Para IIS e HTTP.sys, há suporte apenas para trailers de resposta HTTP/2.

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

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

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

No código de exemplo anterior:

  • SupportsTrailers garante que os trailers sejam compatíveis com a resposta.
  • DeclareTrailer adiciona o nome do trailer fornecido ao cabeçalho de resposta Trailer. Declarar os trailers de uma resposta é opcional, mas recomendado. Se DeclareTrailer for chamado, deverá ser antes que os cabeçalhos de resposta sejam enviados.
  • O AppendTrailer acrescenta o trailer.

Redefinir

A opção Redefinir permite que o servidor redefina uma solicitação HTTP/2 com um código de erro especificado. Uma solicitação de redefinição é considerada anulada.

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

Reset no exemplo de código anterior especifica o código de erro INTERNAL_ERROR. Para obter mais informações sobre códigos de erro HTTP/2, visite a seção de código de erro de especificação HTTP/2.