在 IIS 中将 ASP.NET Core 和 HTTP/2 结合使用

作者:Justin Kotalik

以下 IIS 部署方案中的 ASP.NET Core 支持 HTTP/2

  • 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

有关进程内和进程外托管模型的详细信息,请参阅用于 IIS 的 ASP.NET Core 模块 (ANCM)

默认情况下已为 HTTPS/TLS 连接启用 HTTP/2。 如果未建立 HTTP/2 连接,连接会回退到 HTTP/1.1。 有关使用 IIS 部署的 HTTP/2 配置的详细信息,请参阅 IIS 上的 HTTP/2

用于支持 gRPC 的高级 HTTP/2 功能

IIS 中的其他 HTTP/2 功能支持 gRPC,包括对响应尾部和发送重置帧的支持。

在 IIS 上运行 gRPC 的要求:

  • 进程内托管。
  • 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 规范错误代码”部分