Sdílet prostřednictvím


Použití HTTP/3 s HttpClient

HTTP/3 je třetí a nedávno standardizovaná hlavní verze HTTP. Http/3 používá stejnou sémantiku jako HTTP/1.1 a HTTP/2: stejné metody požadavků, stavové kódy a pole zpráv platí pro všechny verze. Rozdíly jsou v podkladové dopravě. Protokol HTTP/1.1 i HTTP/2 používají jako přenos protokol TCP. PROTOKOL HTTP/3 používá přenosovou technologii vyvinutou společně s protokolem HTTP/3 s názvem QUIC.

HTTP/3 a QUIC mají v porovnání s HTTP/1.1 a HTTP/2 několik výhod:

  • Rychlejší doba odezvy prvního požadavku QUIC a HTTP/3 vyjednávají připojení v menším počtu odezv mezi klientem a serverem. První požadavek dosáhne serveru rychleji.
  • Vylepšené prostředí, když dojde ke ztrátě paketů připojení. Http/2 multiplexes multiplexes multiple requests via one TCP connection. Ztráta paketů v připojení má vliv na všechny požadavky. Tento problém se nazývá "head-of-line blocking". Vzhledem k tomu, že QUIC poskytuje nativní multiplexování, ztracené pakety ovlivňují pouze požadavky, u kterých došlo ke ztrátě dat.
  • Podporuje přechod mezi sítěmi. Tato funkce je užitečná pro mobilní zařízení, kde je běžné přepínat mezi WIFI a mobilními sítěmi, protože se mění umístění mobilního zařízení. V současné době připojení HTTP/1.1 a HTTP/2 selžou s chybou při přepínání sítí. Aplikace nebo webový prohlížeč musí opakovat všechny neúspěšné požadavky HTTP. HTTP/3 umožňuje aplikaci nebo webovému prohlížeči bezproblémově pokračovat, když dojde ke změně sítě. HttpClient A Kestrel nepodporují přechody sítě v .NET 7. Může být k dispozici v budoucí verzi.

Důležité

Aplikace nakonfigurované tak, aby využívaly výhod protokolu HTTP/3, by měly být navržené tak, aby podporovaly také PROTOKOL HTTP/1.1 a HTTP/2. Pokud jsou problémy identifikovány v PROTOKOLU HTTP/3, doporučujeme zakázat http/3, dokud se problémy nevyřeší v budoucí verzi .NET.

Nastavení HttpClient

Verzi HTTP je možné nakonfigurovat nastavením HttpRequestMessage.Version na verzi 3.0. Vzhledem k tomu, že ne všechny směrovače, brány firewall a proxy servery správně podporují protokol HTTP/3, doporučujeme nakonfigurovat protokol HTTP/3 společně s protokolem HTTP/1.1 a HTTP/2. V HttpClienttéto možnosti lze provést zadáním:

Závislosti platformy

PROTOKOL HTTP/3 používá quIC jako svůj přenosový protokol. Implementace .NET protokolu HTTP/3 používá MsQuic k poskytování funkcí QUIC. V důsledku toho podpora rozhraní .NET protokolu HTTP/3 závisí na požadavcích platformy MsQuic. Další informace o tom, jak nainstalovat MsQuic, naleznete v tématu Závislosti platformy QUIC. Pokud platforma, na které běží HttpClient, nemá všechny požadavky na HTTP/3, je zakázaná.

Jak použít HTTPClient

Následující příklad kódu používá příkazy nejvyšší úrovně a ukazuje, jak zadat HTTP3 v požadavku:

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

Podpora HTTP/3 v .NET 6

V .NET 6 je protokol HTTP/3 k dispozici jako funkce preview, protože specifikace HTTP/3 ještě nebyla dokončena. Problémy s chováním nebo výkonem můžou existovat v protokolu HTTP/3 s .NET 6. Další informace o funkcích ve verzi Preview najdete ve specifikaci funkcí preview.

Pokud chcete povolit podporu HTTP/3 v .NET 6, zahrňte uzel RuntimeHostConfigurationOption do souboru projektu a povolte http/3 pomocí HttpClient:

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

Alternativně můžete volat System.AppContext.SetSwitch z kódu aplikace nebo nastavit proměnnou DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT prostředí na true. Další informace najdete v tématu Proměnné prostředí .NET: DOTNET_SYSTEM_NET_HTTP_*.

Důvodem pro vyžadování příznaku konfigurace pro HTTP/3 je ochrana aplikací před budoucí přerušením při použití zásad RequestVersionOrHigherverze . Při volání serveru, který aktuálně používá http/1.1 a HTTP/2, pokud server později upgraduje na HTTP/3, klient by se pokusil použít HTTP/3 a potenciálně nekompatibilní, protože standard není konečný, a proto se může po vydání rozhraní .NET 6 změnit.

.NET 6 je kompatibilní pouze s verzemi 1.9.x knihovny libmsquic. Knihovna Libmsquic 2.x není kompatibilní s .NET 6 kvůli zásadním změnám v knihovně. Knihovna Libmsquic obdrží aktualizace na verzi 1.9.x, pokud je potřeba začlenit opravy zabezpečení.

HTTP/3 Server

Protokol HTTP/3 podporuje ASP.NET se serverem Kestrel v .NET 6 (ve verzi Preview) a .NET 7 (je plně podporován). Další informace najdete v tématu HTTP/3 s webovým serverem ASP.NET Core Kestrel.

Veřejné testovací servery

Cloudflare hostuje lokalitu pro HTTP/3, kterou lze použít k otestování klienta na adrese https://cloudflare-quic.com.

Viz také