HTTP/3 is the latest HTTP protocol version designed to improve web application performance and security. Built on top of the QUIC protocol, HTTP/3 provides faster and more secure communication between the client and the server.
The first step is to install the required packages to enable HTTP/3 in the .NET 6 application.
Using the Package Manager Console with the following command:
Install-Package Microsoft.AspNetCore.Server.Kestrel.Transport.Experimental.Quic
The next step is configuring Kestrel, the web server included with .NET 6, to use QUIC.
It can be done by modifying the configuration file of the application.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
#pragma warning disable CA2252 // This API requires opting into preview features
listenOptions.Protocols = HttpProtocols.Http3;
#pragma warning restore CA2252 // This API requires opting into preview features
listenOptions.UseHttps();
});
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
The above code configures Kestrel to listen on port 5001 using the HTTP/3 protocol.
HttpClient has been updated to include support for HTTP/3, but it needs to be configured with a runtime flag. Include the following in the .csproj file to allow HTTP/3
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>
HTTP/3 needs to be specified as the version for the request:
// See https://aka.ms/new-console-template for more information
using System.Net;
var client = new HttpClient();
client.DefaultRequestVersion = HttpVersion.Version30;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var resp = await client.GetAsync("https://localhost:5001/");
var body = await resp.Content.ReadAsStringAsync();
HTTP/3 is built on top of the QUIC protocol, which is only widely supported by some devices and networks.
Therefore, it’s essential to have backward compatibility with previous versions of the HTTP protocol, such as HTTP/2 and HTTP/1.1, and to ensure that web applications can still be accessed by users using older browsers, operating systems, or networks that do not support HTTP/3.
It can be done by modifying the application's configuration file as follows.
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
#pragma warning disable CA2252 // This API requires opting into preview features
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
#pragma warning restore CA2252 // This API requires opting into preview features
listenOptions.UseHttps();
});
});
Moreover, backward compatibility ensures that a broader audience can access web applications, including users with older devices and networks. It increases the reach of web applications and provides a better user experience for users with limited access to newer technologies.
In conclusion, enabling HTTP/3 in your .NET 6 application is a straightforward process that can significantly improve your web application’s performance and security. Leveraging HTTP/3 provides a better user experience to your customers with faster loading times, reduced latency, and improved reliability.
References
Also published here.