Utiliser HTTP/3 avec HttpClient

HTTP/3 est la troisième version principale normalisée de HTTP. HTTP/3 utilise la même sémantique que HTTP/1.1 et HTTP/2 : les mêmes méthodes de requête, codes d’état et champs de message s’appliquent à toutes les versions. Les différences se trouvent dans le transport sous-jacent. HTTP/1.1 et HTTP/2 utilisent TCP comme transport. HTTP/3 utilise une nouvelle technologie de transport développée avec HTTP/3 appelée QUIC.

HTTP/3 et QUIC présentent un certain nombre d’avantages par rapport à HTTP/1.1 et HTTP/2 :

  • Temps de réponse plus rapide de la première requête. QUIC et HTTP/3 négocient la connexion avec moins d’allers-retours entre le client et le serveur. La première requête atteint le serveur plus rapidement.
  • Amélioration de l’expérience en cas de perte de paquets de connexion. HTTP/2 multiplexe plusieurs requêtes via une connexion TCP. La perte de paquets sur la connexion affecte toutes les requêtes. Ce problème est appelé « blocage en tête de ligne ». Étant donné que QUIC fournit un multiplexage natif, les paquets perdus affectent uniquement les requêtes dans lesquelles des données ont été perdues.
  • Prend en charge la transition entre les réseaux. Cette fonctionnalité est utile pour les appareils mobiles qui passent couramment entre le WIFI et les réseaux cellulaires lors des déplacements de leur utilisateur. Actuellement, les connexions HTTP/1.1 et HTTP/2 échouent avec une erreur lors du basculement de réseaux. Une application ou un navigateur web doit retenter les requêtes HTTP ayant échoué. HTTP/3 permet à l’application ou au navigateur web de continuer à fonctionner de manière transparente en cas de changements de réseau. HttpClient et Kestrel ne prennent pas en charge les transitions réseau dans .NET 7. Il peut être disponible dans une prochaine version.

Important

Les applications configurées pour tirer parti de HTTP/3 doivent être conçues pour prendre également en charge HTTP/1.1 et HTTP/2. Si des problèmes sont identifiés dans HTTP/3, nous recommandons de désactiver HTTP/3 jusqu’à ce que les problèmes soient résolus dans une prochaine version de .NET.

Paramètres HttpClient

La version HTTP peut être configurée en définissant HttpRequestMessage.Version sur 3.0. Toutefois, étant donné que tous les routeurs, pare-feu et proxys prennent correctement en charge HTTP/3, nous vous recommandons de configurer HTTP/3 avec HTTP/1.1 et HTTP/2. Dans HttpClient, vous pouvez le faire en spécifiant :

Dépendances de plateforme

HTTP/3 utilise QUIC comme protocole de transport. L’implémentation .NET de HTTP/3 utilise MsQuic pour fournir des fonctionnalités QUIC. Par conséquent, la prise en charge de HTTP/3 par .NET dépend des exigences de la plateforme MsQuic. Pour plus d’informations sur l’installation de MsQuic, consultez Dépendances de la plateforme QUIC. La plateforme sur laquelle HttpClient s’exécute est désactivé si elle ne remplit pas toutes les exigences pour HTTP/3.

Utilisation de HttpClient

L’exemple de code suivant utilise des instructions de niveau supérieur et montre comment spécifier HTTP3 dans la requête :

// See https://aka.ms/new-console-template for more information
using System.Net;

using var client = new HttpClient
{
    DefaultRequestVersion =  HttpVersion.Version30,
    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};

Console.WriteLine("--- localhost:5001 ---");

HttpResponseMessage resp = await client.GetAsync("https://localhost:5001/");
string body = await resp.Content.ReadAsStringAsync();

Console.WriteLine(
    $"status: {resp.StatusCode}, version: {resp.Version}, " +
    $"body: {body.Substring(0, Math.Min(100, body.Length))}");

Prise en charge de HTTP/3 dans .NET 6

Dans .NET 6, HTTP/3 est disponible en tant que fonctionnalité d’évaluation, car la spécification HTTP/3 n’est pas encore finalisée. Des problèmes de comportement ou de performances peuvent exister dans HTTP/3 avec .NET 6. Pour plus d’informations sur les fonctionnalités d’évaluation, consultez la spécification des fonctionnalités d’évaluation.

Pour activer le support de HTTP/3 dans .NET 6, incluez le nœud RuntimeHostConfigurationOption dans le fichier projet afin d’activer HTTP/3 avec HttpClient :

<ItemGroup>
    <RuntimeHostConfigurationOption Value="true"
        Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>

Vous pouvez également appeler System.AppContext.SetSwitch à partir de votre code d’application ou définir la variable d’environnement DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT sur true. Pour plus d’informations, consultez Variables d’environnement .NET : DOTNET_SYSTEM_NET_HTTP_*.

La raison pour laquelle un indicateur de configuration est requis pour HTTP/3 est de protéger les applications contre les ruptures futures lors de l’utilisation de la stratégie de version RequestVersionOrHigher. Lors de l’appel d’un serveur qui utilise actuellement HTTP/1.1 et HTTP/2, si le serveur effectue une mise à niveau ultérieure vers HTTP/3, le client tente d’utiliser HTTP/3 et peut potentiellement être incompatible, car la norme n’est pas finale et peut donc changer après la mise en production de .NET 6.

.NET 6 est compatible uniquement avec les versions 1.9.x de Libmsquic. Libmsquic 2.x n’est pas compatible avec .NET 6 en raison de changements cassants dans la bibliothèque. Libmsquic reçoit des mises à jour pour 1.9.x quand il est nécessaire d’intégrer des correctifs de sécurité.

Serveur HTTP/3

HTTP/3 est pris en charge par ASP.NET avec le serveur Kestrel dans .NET 6 (en préversion) et .NET 7 (entièrement pris en charge). Pour plus d’informations, consultez Utiliser HTTP/3 avec le serveur web ASP.NET Core Kestrel.

Serveurs de test publics

Cloudflare héberge un site pour HTTP/3 qui permet de tester le client sur https://cloudflare-quic.com.

Voir aussi