Använda HTTP/3 med HttpClient
HTTP/3 är den tredje och nyligen standardiserade huvudversionen av HTTP. HTTP/3 använder samma semantik som HTTP/1.1 och HTTP/2: samma metoder för begäran, statuskoder och meddelandefält gäller för alla versioner. Skillnaderna finns i den underliggande transporten. Både HTTP/1.1 och HTTP/2 använder TCP som transport. HTTP/3 använder en transportteknik som utvecklats tillsammans med HTTP/3 med namnet QUIC.
BÅDE HTTP/3 och QUIC har flera fördelar jämfört med HTTP/1.1 och HTTP/2:
- Snabbare svarstid för den första begäran. QUIC och HTTP/3 förhandlar om anslutningen i färre tur och retur-resor mellan klienten och servern. Den första begäran når servern snabbare.
- Förbättrad upplevelse vid förlust av anslutningspaket. HTTP/2 multiplexar flera begäranden via en TCP-anslutning. Paketförlust på anslutningen påverkar alla begäranden. Det här problemet kallas "head-of-line blocking". Eftersom QUIC tillhandahåller intern multiplexering påverkar förlorade paket endast begäranden där data har gått förlorade.
- Stöder övergång mellan nätverk. Den här funktionen är användbar för mobila enheter där det är vanligt att växla mellan WIFI och mobilnät när en mobil enhet byter plats. För närvarande misslyckas HTTP/1.1- och HTTP/2-anslutningar med ett fel vid växling av nätverk. En app eller webbläsare måste försöka igen med misslyckade HTTP-begäranden. MED HTTP/3 kan appen eller webbläsaren sömlöst fortsätta när ett nätverk ändras. HttpClient och Kestrel stöder inte nätverksövergångar i .NET 7. Den kan vara tillgänglig i en framtida version.
Viktigt!
Appar som har konfigurerats för att dra nytta av HTTP/3 bör utformas för att även stödja HTTP/1.1 och HTTP/2. Om problem identifieras i HTTP/3 rekommenderar vi att du inaktiverar HTTP/3 tills problemen har lösts i en framtida version av .NET.
HttpClient-inställningar
HTTP-versionen kan konfigureras genom att ange HttpRequestMessage.Version
3.0. Men eftersom inte alla routrar, brandväggar och proxyservrar stöder HTTP/3 korrekt rekommenderar vi att du konfigurerar HTTP/3 tillsammans med HTTP/1.1 och HTTP/2. I HttpClient
kan du göra detta genom att ange:
- HttpRequestMessage.Version till 1.1.
- HttpRequestMessage.VersionPolicy till HttpVersionPolicy.RequestVersionOrHigher.
Plattformsberoenden
HTTP/3 använder QUIC som transportprotokoll. .NET-implementeringen av HTTP/3 använder MsQuic för att tillhandahålla QUIC-funktioner. Därför är .NET-stöd för HTTP/3 beroende av msQuic-plattformskrav. Mer information om hur du installerar MsQuic finns i QUIC Platform-beroenden. Om den plattform som HttpClient körs på inte har alla krav för HTTP/3 är den inaktiverad.
Använda HttpClient
Följande kodexempel använder toppnivåinstruktioner och visar hur du anger HTTP3 i begäran:
// 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-support i .NET 6
I .NET 6 är HTTP/3 tillgängligt som en förhandsversionsfunktion eftersom HTTP/3-specifikationen ännu inte har slutförts. Beteende- eller prestandaproblem kan finnas i HTTP/3 med .NET 6. Mer information om förhandsversionsfunktioner finns i specifikationen för förhandsversionsfunktioner.
Om du vill aktivera HTTP/3-stöd i .NET 6 inkluderar du RuntimeHostConfigurationOption
noden i projektfilen för att aktivera HTTP/3 med HttpClient
:
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
Du kan också anropa System.AppContext.SetSwitch från din appkod eller ange DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT
miljövariabeln till true
. Mer information finns i .NET-miljövariabler: DOTNET_SYSTEM_NET_HTTP_*.
Anledningen till att kräva en konfigurationsflagga för HTTP/3 är att skydda appar från framtida avbrott när du använder versionsprincipen RequestVersionOrHigher
. När du anropar en server som för närvarande använder HTTP/1.1 och HTTP/2, om servern senare uppgraderar till HTTP/3, skulle klienten försöka använda HTTP/3 och potentiellt vara inkompatibel eftersom standarden inte är slutgiltig och därför kan ändras när .NET 6 har släppts.
.NET 6 är endast kompatibelt med 1.9.x-versionerna av libmsquic. Libmsquic 2.x är inte kompatibelt med .NET 6 på grund av icke-bakåtkompatibla ändringar i biblioteket. Libmsquic tar emot uppdateringar till 1.9.x när det behövs för att införliva säkerhetskorrigeringar.
HTTP/3 Server
HTTP/3 stöds av ASP.NET med Kestrel-servern i .NET 6 (som en förhandsversion) och .NET 7 (stöds fullt ut). Mer information finns i använda HTTP/3 med webbservern ASP.NET Core Kestrel.
Offentliga testservrar
Cloudflare är värd för en plats för HTTP/3 som kan användas för att testa klienten på https://cloudflare-quic.com.