Default HTTP/3 .NET Support
Tags: dotnet, http3, quic, webdev
Published: 2023-03-28 10:44:01

As the world of web development continues to evolve, the need for faster, more efficient, and secure network protocols becomes increasingly crucial. In .NET 8, developers now have access to the power of the HTTP/3 protocol by default. In this blog post, we will delve into the technical aspects of this feature, covering how it can boost your application's performance and security and go over a basic implementation.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9u2r3ujeb49qdhtqpbky.png)

**What is HTTP/3?**

HTTP/3, the third major version of the Hypertext Transfer Protocol, is the successor to HTTP/2. Built on the QUIC transport layer protocol, HTTP/3 improves upon its predecessor by offering several advantages, including:

1. Faster connection establishment
2. Better multiplexing and prioritization
3. Improved connection migration
4. Enhanced loss recovery


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uun1s1vlgrsyf4f1arrw.png)

**.NET 8 Default Support**

To leverage the advantages of HTTP/3 in your applications, .NET 8 has incorporated it as a default feature, streamlining the development process. The following sections will detail how to enable and utilize HTTP/3 support in your .NET 8 projects.

To enable it for your applications, set the SocketsHttpHandler.Http3Enabled property to true

```
var handler = new SocketsHttpHandler { Http3Enabled = true };
var httpClient = new HttpClient(handler);
```
To enable HTTP/3 support on the server-side using Kestrel, you need to configure the server to listen for QUIC connections. This is achieved by specifying the HttpProtocols.Http3 protocol and providing a valid TLS certificate:

```
var host = new HostBuilder()
    .ConfigureWebHost(webHost =>
    {
        webHost.UseKestrel(options =>
        {
            options.ListenAnyIP(5001, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http3;
                listenOptions.UseHttps("testCert.pfx", "testPassword");
            });
        });
    })
    .Build();

host.Run();
```

To enable for gRPC:

Since gRPC relies on HTTP/2 for communication, enabling HTTP/3 support for gRPC in .NET 8 requires a few adjustments. To use gRPC with HTTP/3, you need to configure the client and server to use HttpClient and Kestrel, respectively:

Client-side:

```
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
    HttpHandler = new SocketsHttpHandler
    {
        Http3Enabled = true
    }
});
```

Server-side:

```
var host = new HostBuilder()
    .ConfigureWebHost(webHost =>
    {
        webHost.UseKestrel(options =>
        {
            options.ListenAnyIP(5001, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http3;
                listenOptions.UseHttps("certificate.pfx", "testPassword");
            });
        });
    })
    .ConfigureServices(services =>
    {
        services.AddGrpc();
    })

.Configure(app =>
{
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<MyGrpcService>();
    });
})
.Build();
host.Run();
   
```
In the next series of this I will post on how to achieve testing and debugging against the HTTP/3 protocol.

Keep coding!

References:
https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8
https://blog.cloudflare.com/content/images/2018/07/http-request-over-quic@2x.png
https://images.ctfassets.net/ee3ypdtck0rk/5oX21p5upAslPIzwJlVPCw/d50a0811796d5c9307ad84ddd0332c90/Screen_Shot_2021-01-28_at_6.46.26.png?w=1323&h=661&q=50&fm=png