HTTP/3 használata a HttpClient használatával
A HTTP/3 a HTTP harmadik, nemrég szabványosított főverziója. A HTTP/3 ugyanazt a szemantikát használja, mint a HTTP/1.1 és a HTTP/2: az összes verzióra ugyanazok a kérési módszerek, állapotkódok és üzenetmezők vonatkoznak. A különbségek a mögöttes átvitelben vannak. A HTTP/1.1 és a HTTP/2 egyaránt a TCP-t használja átvitelként. A HTTP/3 a HTTP/3 mellett kifejlesztett szállítási technológiát, a QUIC-t használja.
A HTTP/3 és a QUIC is számos előnnyel rendelkezik a HTTP/1.1 és a HTTP/2-hez képest:
- Gyorsabb válaszidő az első kéréshez. A QUIC és a HTTP/3 kevesebb, az ügyfél és a kiszolgáló közötti körút során egyezteti a kapcsolatot. Az első kérés gyorsabban éri el a kiszolgálót.
- Továbbfejlesztett felhasználói élmény a kapcsolatcsomagok elvesztése esetén. A HTTP/2 több kérést is multiplexel egy TCP-kapcsolaton keresztül. A kapcsolat csomagvesztése minden kérésre hatással van. Ezt a problémát "sorfedő blokkolásnak" nevezzük. Mivel a QUIC natív multiplexálást biztosít, az elveszett csomagok csak azokat a kéréseket érintik, amelyekben az adatok elvesztek.
- Támogatja a hálózatok közötti váltást. Ez a funkció olyan mobileszközök esetében hasznos, ahol gyakran váltanak a WIFI és a mobilhálózatok között, amikor a mobileszköz helyének megváltozik. A HTTP/1.1 és a HTTP/2 kapcsolatok jelenleg hiba miatt meghiúsulnak a hálózatok közötti váltáskor. Egy alkalmazásnak vagy webböngészőnek újra meg kell próbálkoznia a sikertelen HTTP-kérésekkel. A HTTP/3 lehetővé teszi, hogy az alkalmazás vagy a webböngésző zökkenőmentesen folytassa a hálózatot. HttpClient és a Kestrel nem támogatja a hálózati átmeneteket a .NET 7-ben. Lehetséges, hogy egy későbbi kiadásban lesz elérhető.
Fontos
A HTTP/3 előnyeinek kihasználására konfigurált alkalmazásokat úgy kell megtervezni, hogy a HTTP/1.1 és a HTTP/2 is támogatott legyen. Ha a HTTP/3-ban problémákat talál, javasoljuk, hogy tiltsa le a HTTP/3-at, amíg a .NET egy későbbi kiadásában meg nem oldja a problémákat.
HttpClient-beállítások
A HTTP-verzió a 3.0-s beállítással HttpRequestMessage.Version
konfigurálható. Mivel azonban nem minden útválasztó, tűzfal és proxy támogatja megfelelően a HTTP/3-at, javasoljuk a HTTP/3 http/1.1 és HTTP/2 együttes konfigurálását. Ebben HttpClient
a szakaszban a következő megadásával lehet elvégezni:
- HttpRequestMessage.Version 1.1-hez.
- HttpRequestMessage.VersionPolicy to HttpVersionPolicy.RequestVersionOrHigher.
Platformfüggőségek
A HTTP/3 a QUIC-t használja átviteli protokollként. A HTTP/3 .NET-implementációja az MsQuic használatával biztosítja a QUIC-funkciókat. Ennek eredményeképpen a HTTP/3 .NET-támogatása az MsQuic platform követelményeitől függ. Az MsQuic telepítéséről további információt a QUIC Platform függőségei című témakörben talál. Ha a HttpClient által futtatott platform nem rendelkezik a HTTP/3 összes követelményével, akkor le van tiltva.
HttpClient használata
Az alábbi példakód legfelső szintű utasításokat használ, és bemutatja, hogyan adhatja meg a HTTP3-at a kérelemben:
// 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 támogatás a .NET 6-ban
A .NET 6-ban a HTTP/3 előzetes verziójú funkcióként érhető el, mert a HTTP/3 specifikáció még nem véglegesítve lett. Viselkedési vagy teljesítményproblémák lehetnek a HTTP/3-ban a .NET 6-tal. Az előzetes verziójú funkciókkal kapcsolatos további információkért tekintse meg az előzetes verziójú funkciók specifikációját.
Ha engedélyezni szeretné a HTTP/3-támogatást a .NET 6-ban, adja meg a RuntimeHostConfigurationOption
csomópontot a projektfájlban a HTTP/3 engedélyezéséhez a következővel HttpClient
:
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
Másik lehetőségként meghívhatja System.AppContext.SetSwitch az alkalmazás kódját, vagy beállíthatja a DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT
környezeti változót true
. További információ: .NET környezeti változók: DOTNET_SYSTEM_NET_HTTP_*.
A HTTP/3 konfigurációjelzőjének megkövetelésének oka, hogy a verziószabályzat RequestVersionOrHigher
használata esetén az alkalmazásoknak védelmet kell nyújtaniuk a jövőbeli törésekkel szemben. Ha http/1.1 és HTTP/2 protokollt használó kiszolgálót hív meg, ha a kiszolgáló később HTTP/3-ra frissül, az ügyfél MEGPRÓBÁL HTTP/3-at használni, és valószínűleg nem kompatibilis, mivel a szabvány nem végleges, ezért a .NET 6 kiadása után változhat.
A .NET 6 csak a libmsquic 1.9.x verzióival kompatibilis. A Libmsquic 2.x nem kompatibilis a .NET 6-tal a kódtár kompatibilitástörő változásai miatt. A Libmsquic szükség esetén megkapja az 1.9.x frissítéseit a biztonsági javítások beépítéséhez.
HTTP/3 kiszolgáló
A HTTP/3-at ASP.NET támogatja a Kestrel-kiszolgáló a .NET 6-ban (előzetes verzióban) és a .NET 7-ben (teljes mértékben támogatott). További információ: HTTP/3 használata a ASP.NET Core Kestrel webkiszolgálóval.
Nyilvános tesztkiszolgálók
A Cloudflare http/3-webhelyet üzemeltet, amely az ügyfél https://cloudflare-quic.comteszteléséhez használható.