AspNetCore.Docs/aspnetcore/host-and-deploy/iis/http3.md

4.7 KiB

title author description monikerRange ms.author ms.custom ms.date uid
Use ASP.NET Core with HTTP/3 on IIS tratcher Learn how to use HTTP/3 features with IIS. >= aspnetcore-6.0 chrross mvc 09/09/2021 host-and-deploy/iis/http3

Use ASP.NET Core with HTTP/3 on IIS

[!INCLUDE]

By Chris Ross

:::moniker range=">= aspnetcore-7.0"

HTTP/3 is fully supported with ASP.NET Core in the following IIS scenarios:

  • In-process
  • Out-of-Process. In Out-of-Process, IIS responds to the client using HTTP/3, but the reverse proxy connection to the Kestrel server uses HTTP/1.1.

For more information on the in-process and out-of-process hosting models, see xref:host-and-deploy/aspnet-core-module.

The following requirements also need to be met:

For an in-process deployment when an HTTP/3 connection is established, HttpRequest.Protocol reports HTTP/3. For an out-of-process deployment when an HTTP/3 connection is established, HttpRequest.Protocol reports HTTP/1.1 because that is how IIS proxies the requests to Kestrel.

Alt-Svc

HTTP/3 is discovered as an upgrade from HTTP/1.1 or HTTP/2 via the alt-svc header. That means the first request will normally use HTTP/1.1 or HTTP/2 before switching to HTTP/3. IIS doesn't automatically add the alt-svc header, it must be added by the application. The following code is a middleware example that adds the alt-svc response header.

app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});

Place the preceding code early in the request pipeline.

IIS also supports sending an AltSvc HTTP/2 protocol message rather than a response header to notify the client that HTTP/3 is available. See the EnableAltSvc registry key. Note this requires netsh sslcert bindings that use host names rather than IP addresses.

:::moniker-end

:::moniker range="= aspnetcore-6.0"

HTTP/3 is supported with ASP.NET Core in the following IIS deployment scenarios:

  • In-process
  • Out-of-Process. In Out-of-Process, IIS responds to the client using HTTP/3, but the reverse proxy connection to the Kestrel server uses HTTP/1.1.

For more information on the in-process and out-of-process hosting models, see xref:host-and-deploy/aspnet-core-module.

The following requirements also need to be met:

For an in-process deployment when an HTTP/3 connection is established, HttpRequest.Protocol reports HTTP/3. For an out-of-process deployment when an HTTP/3 connection is established, HttpRequest.Protocol reports HTTP/1.1 because that is how IIS proxies the requests to Kestrel.

Alt-Svc

HTTP/3 is discovered as an upgrade from HTTP/1.1 or HTTP/2 via the alt-svc header. That means the first request will normally use HTTP/1.1 or HTTP/2 before switching to HTTP/3. IIS doesn't automatically add the alt-svc header, it must be added by the application. The following code is a middleware example that adds the alt-svc response header.

app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});

Place the preceding code early in the request pipeline.

IIS also supports sending an AltSvc HTTP/2 protocol message rather than a response header to notify the client that HTTP/3 is available. See the EnableAltSvc registry key. Note this requires netsh sslcert bindings that use host names rather than IP addresses.

:::moniker-end