Verwenden von HTTP/3 mit HttpClient

HTTP/3 ist die dritte und kürzlich standardisierte Hauptversion von HTTP. HTTP/3 verwendet die gleiche Semantik wie HTTP/1.1 und HTTP/2: Alle Versionen verwenden die gleichen Anforderungsmethoden, Statuscodes und Nachrichtenfelder. Die Unterschiede bestehen beim zugrunde liegenden Datentransport. Sowohl HTTP/1.1 als auch HTTP/2 verwenden TCP für den Datentransport. HTTP/3 verwendet eine Datentransporttechnologie, die parallel zu HTTP/3 entwickelt wurde und QUIC heißt.

HTTP/3 und QUIC bieten im Vergleich zu HTTP/1.1 und HTTP/2 mehrere Vorteile:

  • Schnellere Antwortzeit bei der ersten Anforderung. QUIC und HTTP/3 handeln die Verbindung in weniger Roundtrips zwischen dem Client und dem Server aus. Die erste Anforderung erreicht den Server schneller.
  • Verbesserte Verarbeitung beim Verlust von Verbindungspaketen. HTTP/2 führt Multiplexing für mehrere Aufrufe über eine einzige TCP-Verbindung aus. Ein Paketverlust bei der Verbindung wirkt sich auf alle Anforderungen aus. Dieses Problem wird als „Head-of-Line Blocking“ (Blockierung durch den Anfang der Schlange) bezeichnet. Da QUIC natives Multiplexing bietet, wirken sich verlorene Pakete nur auf die Anforderungen aus, bei denen Daten verloren gegangen sind.
  • Unterstützt den Übergang zwischen Netzwerken. Dieses Feature ist nützlich für mobile Geräte, bei denen ein Wechsel zwischen WLAN und Mobilfunknetzwerken üblich ist, wenn ein mobiles Gerät den Standort ändert. Derzeit tritt bei HTTP/1.1- und HTTP/2-Verbindungen beim Wechsel des Netzwerks ein Fehler auf. Eine App oder ein Webbrowser muss alle fehlgeschlagenen HTTP-Anforderungen wiederholen. Bei HTTP/3 kann die App oder der Webbrowser nahtlos fortfahren, wenn sich ein Netzwerk ändert. HttpClient und Kestrel unterstützen keine Netzwerkübergänge in .NET 7. Möglicherweise wird dies in einem zukünftigen Release unterstützt.

Wichtig

Für HTTP/3 konfigurierte Apps sollten auch für die Unterstützung von HTTP/1.1 und HTTP/2 ausgelegt sein. Wenn Probleme mit HTTP/3 auftreten, sollten Sie HTTP/3 deaktivieren, bis diese in einem zukünftigen Release von ASP.NET Core behoben werden.

HttpClient-Einstellungen

Die HTTP-Version kann durch Einstellung von HttpRequestMessage.Version auf 3.0 konfiguriert werden. Da HTTP/3 nicht von allen Routern, Firewalls und Proxys ordnungsgemäß unterstützt wird, empfiehlt es sich, HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 zu konfigurieren. In HttpClient kann dies durch Angabe von folgendem Wert erfolgen:

Plattformabhängigkeiten

HTTP/3 verwendet QUIC als Datentransportprotokoll. Die .NET-Implementierung von HTTP/3 verwendet MsQuic, um QUIC-Funktionen zur Verfügung zu stellen. Daher hängt die .NET-Unterstützung von HTTP/3 von den MsQuic-Plattformanforderungen ab. Weitere Informationen zum Installalationsvorgang für MsQuic finden Sie unter QUIC Plattformabhängigkeiten. Wenn die Plattform, auf der HttpClient ausgeführt wird, nicht alle Voraussetzungen für HTTP/3 erfüllt, wird sie deaktiviert.

Verwenden von HTTPClient

Das folgende Codebeispiel verwendet Anweisungen auf oberster Ebene und zeigt, wie HTTP3 in der Anforderung angegeben wird:

// 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))}");

HTTP/3-Unterstützung in .NET 6

In .NET 6 ist HTTP/3 als Vorschaufeature verfügbar, da die HTTP/3-Spezifikation noch nicht abgeschlossen wurde. Verhaltens- oder Leistungsprobleme können in HTTP/3 mit .NET 6 auftreten. Weitere Informationen zu Previewfunktionen finden Sie in der Spezifikation zu Previewfunktionen.

Um die HTTP/3-Unterstützung in .NET 6 zu aktivieren, fügen Sie den Knoten RuntimeHostConfigurationOption in die Projektdatei ein, um HTTP/3 mit HttpClient zu aktivieren:

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

Alternativ können Sie System.AppContext.SetSwitch über Ihren App-Code aufrufen oder die DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT-Umgebungsvariable true auf festlegen. Weitere Informationen finden Sie unter .NET-Umgebungsvariablen: DOTNET_SYSTEM_NET_HTTP_*.

Ein Konfigurationsflag ist für HTTP/3 erforderlich, damit Anwendungen vor zukünftigen Fehlern geschützt werden, wenn sie die Versionsrichtlinie RequestVersionOrHigher verwenden. Beim Aufrufen eines Servers, der derzeit HTTP/1.1 und HTTP/2 verwendet, versucht der Client, HTTP/3 zu verwenden, wenn der Server später ein Upgrade auf HTTP/3 durchführt, das möglicherweise inkompatibel ist, da der Standard nicht endgültig ist und sich daher nach der Veröffentlichung von .NET 6 ändern kann.

.NET 6 ist nur mit den Versionen 1.9.x von libmsquic kompatibel. Libmsquic 2.x ist aufgrund von Breaking Changes in der Bibliothek nicht mit .NET 6 kompatibel. Libmsquic empfängt Updates auf 1.9.x, wenn Sicherheitskorrekturen integriert werden müssen.

HTTP/3-Server

HTTP/3 wird von ASP.NET mit dem Kestrel-Server in .NET 6 (als Vorschau) und .NET 7 (vollständige Unterstützung) unterstützt. Weitere Informationen finden Sie unter Verwendung von HTTP/3 mit dem ASP.NET Core Kestrel-Webserver.

Öffentliche Testserver

Cloudflare hostet eine Site für HTTP/3, die zum Testen des Clients unter https://cloudflare-quic.comverwendet werden kann.

Siehe auch