Condividi tramite


Usare HTTP/3 con HttpClient

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 HttpClientquesta operazione può essere eseguita specificando:

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.

Vedere anche