Używanie protokołu HTTP/3 z klientem HttpClient

HTTP/3 to trzecia i ostatnio ustandaryzowana wersja główna protokołu HTTP. Protokół HTTP/3 używa tej samej semantyki co http/1.1 i HTTP/2: te same metody żądania, kody stanu i pola komunikatów mają zastosowanie do wszystkich wersji. Różnice dotyczą transportu bazowego. Protokół HTTP/1.1 i HTTP/2 używają protokołu TCP jako transportu. Protokół HTTP/3 używa technologii transportowej opracowanej obok protokołu HTTP/3 o nazwie QUIC.

Protokoły HTTP/3 i QUIC mają kilka korzyści w porównaniu z protokołami HTTP/1.1 i HTTP/2:

  • Krótszy czas odpowiedzi dla pierwszego żądania. QUIC i HTTP/3 negocjują połączenie w mniejszej liczbie rund między klientem a serwerem. Pierwsze żądanie dociera do serwera szybciej.
  • Ulepszone środowisko w przypadku utraty pakietów połączenia. Protokół HTTP/2 multipleksuje wiele żądań za pośrednictwem jednego połączenia TCP. Utrata pakietów w połączeniu ma wpływ na wszystkie żądania. Ten problem jest nazywany "blokowaniem nagłówka wiersza". Ponieważ funkcja QUIC zapewnia natywne multipleksowanie, utracone pakiety wpływają tylko na żądania, w których dane zostały utracone.
  • Obsługuje przechodzenie między sieciami. Ta funkcja jest przydatna w przypadku urządzeń przenośnych, w których często przełącza się między sieciami Wi-Fi i komórkowymi, ponieważ urządzenie przenośne zmienia lokalizację. Obecnie połączenia HTTP/1.1 i HTTP/2 kończą się niepowodzeniem z powodu błędu podczas przełączania sieci. Aplikacja lub przeglądarka internetowa musi ponowić próbę wykonania wszystkich żądań HTTP, które zakończyły się niepowodzeniem. Protokół HTTP/3 umożliwia bezproblemowe kontynuowanie działania aplikacji lub przeglądarki internetowej po zmianie sieci. HttpClient I Kestrel nie obsługują przejścia sieci na platformie .NET 7. Może być dostępna w przyszłej wersji.

Ważne

Aplikacje skonfigurowane do korzystania z protokołu HTTP/3 powinny być zaprojektowane tak, aby obsługiwały również protokół HTTP/1.1 i HTTP/2. Jeśli problemy są identyfikowane w protokole HTTP/3, zaleca się wyłączenie protokołu HTTP/3 do momentu rozwiązania problemów w przyszłej wersji platformy .NET.

Ustawienia klienta HttpClient

Wersję HTTP można skonfigurować, ustawiając wartość HttpRequestMessage.Version 3.0. Jednak ponieważ nie wszystkie routery, zapory i serwery proxy prawidłowo obsługują protokół HTTP/3, zaleca się skonfigurowanie protokołu HTTP/3 wraz z protokołem HTTP/1.1 i HTTP/2. W HttpClientpliku można to zrobić, określając:

Zależności platformy

Protokół HTTP/3 używa protokołu QUIC jako protokołu transportowego. Implementacja platformy .NET protokołu HTTP/3 używa biblioteki MsQuic do zapewnienia funkcji QUIC . W związku z tym obsługa platformy .NET protokołu HTTP/3 zależy od wymagań platformy MsQuic. Aby uzyskać więcej informacji na temat sposobu instalowania biblioteki MsQuic, zobacz Zależności platformy QUIC. Jeśli platforma, na którą działa klient HttpClient, nie ma wszystkich wymagań dotyczących protokołu HTTP/3, jest wyłączona.

Korzystanie z obiektu HttpClient

W poniższym przykładzie kodu użyto instrukcji najwyższego poziomu i pokazano, jak określić http3 w żądaniu:

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

Obsługa protokołu HTTP/3 na platformie .NET 6

Na platformie .NET 6 protokół HTTP/3 jest dostępny jako funkcja w wersji zapoznawczej, ponieważ specyfikacja HTTP/3 nie została jeszcze sfinalizowana. Problemy z zachowaniem lub wydajnością mogą istnieć w protokole HTTP/3 na platformie .NET 6. Aby uzyskać więcej informacji na temat funkcji w wersji zapoznawczej, zobacz specyfikację funkcji w wersji zapoznawczej.

Aby włączyć obsługę protokołu HTTP/3 na platformie .NET 6, dołącz RuntimeHostConfigurationOption węzeł w pliku projektu, aby włączyć protokół HTTP/3 za pomocą HttpClientpolecenia :

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

Alternatywnie możesz wywołać metodę System.AppContext.SetSwitch z kodu aplikacji lub ustawić zmienną DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT środowiskową na true. Aby uzyskać więcej informacji, zobacz Zmienne środowiskowe platformy .NET: DOTNET_SYSTEM_NET_HTTP_*.

Przyczyną wymagania flagi konfiguracji protokołu HTTP/3 jest ochrona aplikacji przed przyszłymi awariami podczas korzystania z zasad RequestVersionOrHigherwersji. Podczas wywoływania serwera, który obecnie używa protokołu HTTP/1.1 i HTTP/2, jeśli serwer później uaktualnia się do protokołu HTTP/3, klient spróbuje użyć protokołu HTTP/3 i potencjalnie będzie niezgodny, ponieważ standard nie jest końcowy i dlatego może ulec zmianie po wydaniu platformy .NET 6.

Platforma .NET 6 jest zgodna tylko z wersjami biblioteki libmsquic w wersji 1.9.x. Biblioteka Libmsquic 2.x nie jest zgodna z platformą .NET 6 z powodu zmian powodu powodujących niezgodność w bibliotece. Biblioteka Libmsquic odbiera aktualizacje do wersji 1.9.x w razie potrzeby w celu uwzględnienia poprawek zabezpieczeń.

Serwer HTTP/3

Protokół HTTP/3 jest obsługiwany przez ASP.NET z serwerem Kestrel na platformie .NET 6 (jako wersja zapoznawcza) i platformą .NET 7 (jest w pełni obsługiwana). Aby uzyskać więcej informacji, zobacz używanie protokołu HTTP/3 z serwerem internetowym ASP.NET Core Kestrel.

Publiczne serwery testowe

Cloudflare hostuje lokację dla protokołu HTTP/3, która może służyć do testowania klienta pod adresem https://cloudflare-quic.com.

Zobacz też