Skip to content

Reconsider enabling HTTP/3 by default in .NET 8 #50131

Closed
@adityamandaleeka

Description

@adityamandaleeka

We've had HTTP/3 enabled by default in Kestrel since .NET 8 Preview 1. As we are about to wrap up .NET 8 we need to decide whether to ship with that left as-is, or go back to having HTTP/3 support being opt-in.

Reasons to reconsider the default

  • On Windows, launching an ASP.NET Core app for the first time with HTTP/3 causes a Defender warning to appear, asking you to confirm if the app should be allowed to communicate on Domain/Private/Public networks. This is added friction that we didn't have before, and is especially annoying if you work with multiple apps (you'll get a pop up for each one).
    image

We believe this occurs because of the way msquic (which .NET's QUIC support is built upon) has to create its listener. It has to grab a wildcard listener up front because of how it supports multiplexing multiple apps on the same UDP port.

  • Getting HTTP/3 actually working locally with a browser takes a few extra steps. Browsers don't allow self-signed certificates on HTTP/3, so there's some effort required to get the end-to-end working anyway, and having to explicitly enable HTTP/3 on the server side isn't a huge added cost.

Options

  1. Do nothing; HTTP/3 will be enabled by default in .NET 8.
    • Developers on Windows will get the above Defender pop-ups the first time they launch a specific app (subsequent launches of the same application will not trigger the pop-up unless it is renamed).
  2. Disable HTTP/3 by default only in Development mode (leave it enabled by default in other modes). Developers who want it will be able to easily enable it.
    • The downside of this is that things will run differently by default during development than how they run in production.
  3. Disable HTTP/3 by default in all modes. Developers who want it will be able to easily enable it.
    • Keep the status quo in .NET 8. People who do nothing to opt into HTTP/3 will continue to get HTTP/1 and /2 by default.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-networkingIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions