Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
HTTP/3 è la terza versione principale standardizzata di recente di HTTP. HTTP/3 usa la stessa semantica di HTTP/1.1 e HTTP/2: a tutte le versioni si applicano i medesimi metodi di richiesta, codici di stato e campi dei messaggi. Le differenze stanno nel trasporto sottostante. Sia HTTP/1.1 che HTTP/2 usano TCP come protocollo di trasporto. HTTP/3 usa una tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.
HTTP/3 e QUIC hanno entrambi diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:
- Tempo di risposta più rapido per la prima richiesta. QUIC e HTTP/3 negoziano la connessione in meno round trip tra il client e il server. La prima richiesta raggiunge il server più velocemente.
- Esperienza migliorata quando si verifica una perdita di pacchetti di connessione. HTTP/2 esegue il multiplexing di più richieste tramite una connessione TCP. La perdita di pacchetti sulla connessione influisce su tutte le richieste. Questo problema è denominato "blocco head-of-line". Poiché QUIC fornisce il multiplexing nativo, i pacchetti persi influiscono solo sulle richieste in cui i dati sono stati persi.
- Supporta la transizione tra reti. Questa funzionalità è utile per i dispositivi mobili in cui è comune passare da una rete wi-fi all'altra quando un dispositivo mobile cambia posizione. Attualmente, le connessioni HTTP/1.1 e HTTP/2 hanno esito negativo e si verifica un errore durante il cambio di rete. Un'app o un Web browser deve ritentare eventuali richieste HTTP non riuscite. HTTP/3 consente all'app o al Web browser di continuare senza problemi quando cambia la rete. HttpClient E Kestrel non supportano le transizioni di rete in .NET 7. Il supporto potrebbe essere disponibile in una versione futura.
Importante
Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2. Se i problemi vengono identificati in HTTP/3, è consigliabile disabilitare HTTP/3 fino a quando i problemi non vengono risolti in una versione futura di .NET.
Impostazioni httpClient
La versione HTTP può essere configurata impostando HttpRequestMessage.Version
su 3.0. Tuttavia, poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, è consigliabile configurare HTTP/3 insieme a HTTP/1.1 e HTTP/2. In HttpClient
questa operazione può essere eseguita specificando:
- HttpRequestMessage.Version a 1.1.
- Da HttpRequestMessage.VersionPolicy a HttpVersionPolicy.RequestVersionOrHigher.
Dipendenze della piattaforma
HTTP/3 usa QUIC come protocollo di trasporto. L'implementazione .NET di HTTP/3 usa MsQuic per fornire funzionalità QUIC. Di conseguenza, il supporto .NET di HTTP/3 dipende dai requisiti della piattaforma MsQuic. Per altre informazioni su come installare MsQuic, vedere Dipendenze della piattaforma QUIC. Se la piattaforma in cui è in esecuzione HttpClient non ha tutti i requisiti per HTTP/3, è disabilitata.
Uso di HttpClient
Nell'esempio di codice seguente vengono usate istruzioni di primo livello e viene illustrato come specificare HTTP3 nella richiesta:
// 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))}");
Supporto HTTP/3 in .NET 6
In .NET 6 HTTP/3 è disponibile come funzionalità di anteprima perché la specifica HTTP/3 non è ancora stata completata. I problemi comportamentali o di prestazioni possono verificarsi in HTTP/3 con .NET 6. Per altre informazioni sulle funzionalità di anteprima, vedere la specifica delle funzionalità di anteprima.
Per abilitare il supporto HTTP/3 in .NET 6, includere il RuntimeHostConfigurationOption
nodo nel file di progetto per abilitare HTTP/3 con HttpClient
:
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
In alternativa, è possibile chiamare System.AppContext.SetSwitch dal codice dell'app o impostare la DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT
variabile di ambiente su true
. Per altre informazioni, vedere Variabili di ambiente .NET: DOTNET_SYSTEM_NET_HTTP_*.
Il motivo per cui è necessario un flag di configurazione per HTTP/3 è proteggere le app da interruzioni future quando si usano i criteri di versione RequestVersionOrHigher
. Quando si chiama un server che attualmente usa HTTP/1.1 e HTTP/2, se il server viene aggiornato successivamente a HTTP/3, il client tenterà di usare HTTP/3 e potenzialmente non è compatibile perché lo standard non è finale e pertanto può cambiare dopo il rilascio di .NET 6.
.NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile con .NET 6 a causa di cambiamenti dirompenti nella libreria. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.
HTTP/3 Server
HTTP/3 è supportato da ASP.NET con il server Kestrel in .NET 6 (come anteprima) e .NET 7 (è completamente supportato). Per altre informazioni, vedere Usare HTTP/3 con il server Web ASP.NET Core Kestrel.
Server di test pubblici
Cloudflare ospita un sito per HTTP/3 che può essere usato per testare il client in https://cloudflare-quic.com.