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 HttpClient
této možnosti lze provést zadáním:
- HttpRequestMessage.Version do 1.1.
- HttpRequestMessage.VersionPolicy do HttpVersionPolicy.RequestVersionOrHigher.
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 RequestVersionOrHigher
verze . 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.