Freigeben über


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 Transporttechnologie, die zusammen mit HTTP/3 namens QUIC entwickelt wurde.

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

  • Schnellere Reaktionszeit für die erste Anforderung. QUIC und HTTP/3 handeln die Verbindung mit weniger Rundreisen zwischen Client und Server aus. Die erste Anforderung erreicht den Server schneller.
  • Verbesserte Erfahrung 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 systemeigene Multiplexing bereitstellt, wirken sich verlorene Pakete nur auf die Anfragen 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 es üblich ist, zwischen WLAN und Mobilfunknetzen zu wechseln, da ein mobiles Gerät den Standort ändert. Derzeit schlagen HTTP/1.1- und HTTP/2-Verbindungen beim Wechseln von Netzwerken mit einem Fehler fehl. 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.

Von Bedeutung

Für HTTP/3 konfigurierte Apps sollten auch für die Unterstützung von HTTP/1.1 und HTTP/2 ausgelegt sein. Wenn Probleme in HTTP/3 identifiziert werden, empfiehlt es sich, HTTP/3 zu deaktivieren, bis die Probleme in einer zukünftigen Version von .NET behoben werden.

HttpClient-Einstellungen

Die HTTP-Version kann durch Festlegen HttpRequestMessage.Version auf 3.0 konfiguriert werden. Da jedoch nicht alle Router, Firewalls und Proxys HTTP/3 ordnungsgemäß unterstützen, empfiehlt es sich, HTTP/3 zusammen mit HTTP/1.1 und HTTP/2 zu konfigurieren. In HttpClient, kann dies erfolgen, indem Sie Folgendes angeben:

Plattformabhängigkeiten

HTTP/3 verwendet QUIC als Transportprotokoll. Die .NET-Implementierung von HTTP/3 verwendet MsQuic , um QUIC-Funktionen bereitzustellen. Daher hängt die .NET-Unterstützung von HTTP/3 von den MsQuic-Plattformanforderungen ab. Weitere Informationen zum Installieren von MsQuic finden Sie unter QUIC Platform-Abhängigkeiten. Wenn die Plattform, auf der HttpClient ausgeführt wird, nicht über alle Anforderungen für HTTP/3 verfügt, ist sie deaktiviert.

Verwenden von HttpClient

Im folgenden Codebeispiel werden Anweisungen der obersten Ebene verwendet und veranschaulicht, 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 Vorschaufeatures finden Sie in der Spezifikation der Vorschaufeatures.

Um die Unterstützung für HTTP/3 in .NET 6 zu aktivieren, fügen Sie das RuntimeHostConfigurationOption Element in die Projektdatei ein, um HTTP/3 mit HttpClient zu verwenden.

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

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

Der Grund dafür, dass eine Konfigurationskennzeichnung für HTTP/3 erforderlich ist, besteht darin, Apps vor zukünftigen Unterbrechungen bei Verwendung der Versionsrichtlinie RequestVersionOrHigherzu schützen. Beim Aufrufen eines Servers, der derzeit HTTP/1.1 und HTTP/2 verwendet, würde der Client versuchen, HTTP/3 zu verwenden, wenn der Server später auf HTTP/3 aktualisiert wird und möglicherweise nicht kompatibel ist, da der Standard nicht abgeschlossen ist und sich daher ändern kann, nachdem .NET 6 veröffentlicht wurde.

.NET 6 ist nur mit den 1.9.x-Versionen 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 unterstützt (wird vollständig unterstützt). Weitere Informationen finden Sie unter HTTP/3 mit dem ASP.NET Core Kestrel-Webserver.

Öffentliche Testserver

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

Siehe auch