HTTP/3 gebruiken met HttpClient
HTTP/3 is de derde en onlangs gestandaardiseerde primaire versie van HTTP. HTTP/3 maakt gebruik van dezelfde semantiek als HTTP/1.1 en HTTP/2: dezelfde aanvraagmethoden, statuscodes en berichtvelden zijn van toepassing op alle versies. De verschillen zijn in het onderliggende transport. Zowel HTTP/1.1 als HTTP/2 gebruiken TCP als transport. HTTP/3 maakt gebruik van een transporttechnologie die is ontwikkeld naast HTTP/3 met de naam QUIC.
HTTP/3 en QUIC hebben beide verschillende voordelen vergeleken met HTTP/1.1 en HTTP/2:
- Snellere reactietijd voor de eerste aanvraag. QUIC en HTTP/3 onderhandelen over de verbinding in minder retouren tussen de client en de server. De eerste aanvraag bereikt de server sneller.
- Verbeterde ervaring bij verlies van verbindingspakketten. HTTP/2 multiplexes meerdere aanvragen via één TCP-verbinding. Pakketverlies op de verbinding is van invloed op alle aanvragen. Dit probleem wordt 'head-of-line blocking' genoemd. Omdat QUIC systeemeigen multiplexing biedt, hebben verloren pakketten alleen invloed op de aanvragen waar gegevens verloren zijn gegaan.
- Ondersteunt de overgang tussen netwerken. Deze functie is handig voor mobiele apparaten waarbij het gebruikelijk is om te schakelen tussen WIFI- en mobiele netwerken als een mobiel apparaat de locatie wijzigt. Momenteel mislukken HTTP/1.1- en HTTP/2-verbindingen met een fout bij het schakelen tussen netwerken. Een app of webbrowser moet mislukte HTTP-aanvragen opnieuw proberen. Met HTTP/3 kan de app of webbrowser naadloos doorgaan wanneer een netwerk wordt gewijzigd. HttpClient en Kestrel biedt geen ondersteuning voor netwerkovergangen in .NET 7. Het is mogelijk beschikbaar in een toekomstige release.
Belangrijk
Apps die zijn geconfigureerd om te profiteren van HTTP/3, moeten worden ontworpen om ook HTTP/1.1 en HTTP/2 te ondersteunen. Als er problemen worden geïdentificeerd in HTTP/3, wordt u aangeraden HTTP/3 uit te schakelen totdat de problemen in een toekomstige release van .NET zijn opgelost.
HttpClient-instellingen
De HTTP-versie kan worden geconfigureerd door in te stellen HttpRequestMessage.Version
op 3.0. Omdat niet alle routers, firewalls en proxy's HTTP/3 correct ondersteunen, wordt u aangeraden HTTP/3 samen met HTTP/1.1 en HTTP/2 te configureren. U HttpClient
kunt dit doen door het volgende op te geven:
- HttpRequestMessage.Version tot 1.1.
- HttpRequestMessage.VersionPolicy aan HttpVersionPolicy.RequestVersionOrHigher.
Platformafhankelijkheden
HTTP/3 maakt gebruik van QUIC als transportprotocol. De .NET-implementatie van HTTP/3 maakt gebruik van MsQuic om QUIC-functionaliteit te bieden. Als gevolg hiervan is .NET-ondersteuning van HTTP/3 afhankelijk van de vereisten voor het MsQuic-platform. Zie QUIC-platformafhankelijkheden voor meer informatie over het installeren van MsQuic. Als het platform waarop HttpClient wordt uitgevoerd niet alle vereisten voor HTTP/3 heeft, is dit uitgeschakeld.
Met behulp van HttpClient
In het volgende codevoorbeeld worden instructies op het hoogste niveau gebruikt en wordt gedemonstreert hoe u HTTP3 opgeeft in de aanvraag:
// 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-ondersteuning in .NET 6
In .NET 6 is HTTP/3 beschikbaar als preview-functie omdat de HTTP/3-specificatie nog niet is voltooid. Gedrags- of prestatieproblemen kunnen voorkomen in HTTP/3 met .NET 6. Zie de specificatie van preview-functies voor meer informatie over preview-functies.
Als u HTTP/3-ondersteuning in .NET 6 wilt inschakelen, neemt u het RuntimeHostConfigurationOption
knooppunt op in het projectbestand om HTTP/3 in te schakelen met HttpClient
:
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
U kunt ook aanroepen System.AppContext.SetSwitch vanuit uw app-code of de DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT
omgevingsvariabele instellen op true
. Zie .NET-omgevingsvariabelen: DOTNET_SYSTEM_NET_HTTP_*voor meer informatie.
De reden voor het vereisen van een configuratievlag voor HTTP/3 is om apps te beschermen tegen toekomstige onderbrekingen bij het gebruik van versiebeleid RequestVersionOrHigher
. Bij het aanroepen van een server die momenteel gebruikmaakt van HTTP/1.1 en HTTP/2, als de server later wordt bijgewerkt naar HTTP/3, probeert de client HTTP/3 te gebruiken en mogelijk niet compatibel omdat de standaard niet definitief is en daarom kan worden gewijzigd nadat .NET 6 is uitgebracht.
.NET 6 is alleen compatibel met de 1.9.x-versies van libmsquic. Libmsquic 2.x is niet compatibel met .NET 6 vanwege belangrijke wijzigingen in de bibliotheek. Libmsquic ontvangt updates voor 1.9.x wanneer dat nodig is om beveiligingsoplossingen op te nemen.
HTTP/3-server
HTTP/3 wordt ondersteund door ASP.NET met de Kestrel-server in .NET 6 (als preview) en .NET 7 (wordt volledig ondersteund). Zie HTTP/3 gebruiken met de ASP.NET Core Kestrel-webserver voor meer informatie.
Openbare testservers
Cloudflare host een site voor HTTP/3 die kan worden gebruikt om de client te testen op https://cloudflare-quic.com.