Usare HTTP/3 con il server Web ASP.NET Core Kestrel
Nota
Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 8 di questo articolo.
Avviso
Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 di questo articolo.
Importante
Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Per la versione corrente, vedere la versione .NET 8 di questo articolo.
HTTP/3 è uno standard approvato e la terza versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3. HTTP/3 è completamente supportato in ASP.NET Core 7.0 e versioni successive.
Importante
Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2.
Requisiti HTTP/3
HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, viene disabilitata e Kestrel verrà eseguito il fallback ad altri protocolli HTTP.
Finestre
- Windows 11 Build 22000 o versione successiva o Windows Server 2022.
- Connessione TLS 1.3 o successiva.
Linux
libmsquic
pacchetto installato.
libmsquic
viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com
. Per installare questo pacchetto:
- Aggiungere il
packages.microsoft.com
repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft. - Installare il
libmsquic
pacchetto usando la gestione pacchetti della distribuzione. Ad esempio,apt install libmsquic=1.9*
in Ubuntu.
Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.
macOS
HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.
Introduzione
HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs
abilitare HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Il codice precedente configura la porta 5001 per:
- Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando
HttpProtocols.Http1AndHttp2AndHttp3
. - Abilitare HTTPS con
UseHttps
. HTTP/3 richiede HTTPS.
Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3
come protocolli supportati da un endpoint.
Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.
Alt-svc
HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc
. Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc
se HTTP/3 è abilitato.
Test localhost
I browser non consentono certificati autofirmato su HTTP/3, ad esempio il Kestrel certificato di sviluppo.
HttpClient
può essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClient
per effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version
3.0 o - Impostare
HttpRequestMessage.VersionPolicy
suHttpVersionPolicy.RequestVersionOrHigher
.
- Impostare su
Vantaggi di HTTP/3
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 nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.
HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:
- Tempo di risposta più rapido della 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 influisce 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 perché un dispositivo mobile cambia posizione. Attualmente, durante il cambio di rete le connessioni HTTP/1.1 e HTTP/2 hanno esito negativo e restituiscono un errore. 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. Kestrel non supporta le transizioni di rete in .NET 8. Il supporto potrebbe essere disponibile in una versione futura.
HTTP/3 è uno standard proposto e la terza versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3. HTTP/3 è completamente supportato in ASP.NET Core 7.0 e versioni successive.
Importante
Le app configurate per sfruttare i vantaggi di HTTP/3 devono essere progettate per supportare anche HTTP/1.1 e HTTP/2.
Requisiti HTTP/3
HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, è disabilitata e Kestrel eseguirà il fallback ad altri protocolli HTTP.
Finestre
- Windows 11 Build 22000 o versione successiva o Windows Server 2022.
- Connessione TLS 1.3 o successiva.
Linux
libmsquic
pacchetto installato.
libmsquic
viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com
. Per installare questo pacchetto:
- Aggiungere il
packages.microsoft.com
repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft. - Installare il
libmsquic
pacchetto usando la gestione pacchetti della distribuzione. Ad esempio,apt install libmsquic=1.9*
in Ubuntu.
Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.
macOS
HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.
Introduzione
HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs
abilitare HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Il codice precedente configura la porta 5001 per:
- Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando
HttpProtocols.Http1AndHttp2AndHttp3
. - Abilitare HTTPS con
UseHttps
. HTTP/3 richiede HTTPS.
Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3
come protocolli supportati da un endpoint.
Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.
Alt-svc
HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc
. Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc
se HTTP/3 è abilitato.
Test localhost
I browser non consentono certificati autofirmato su HTTP/3, ad esempio il Kestrel certificato di sviluppo.
HttpClient
può essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClient
per effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version
3.0 o - Impostare
HttpRequestMessage.VersionPolicy
suHttpVersionPolicy.RequestVersionOrHigher
.
- Impostare su
Vantaggi di HTTP/3
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 nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.
HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:
- Tempo di risposta più rapido della 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 influisce 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 perché 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 reti. 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. Kestrel non supporta le transizioni di rete in .NET 6. Il supporto potrebbe essere disponibile in una versione futura.
HTTP/3 è la terza e prossima versione principale di HTTP. Questo articolo illustra i requisiti per HTTP/3 e come configurarlo Kestrel per usarlo.
Importante
HTTP/3 è disponibile in .NET 6 come funzionalità di anteprima. La specifica HTTP/3 non è stata finalizzata e potrebbero verificarsi problemi di comportamento o prestazioni in HTTP/3 con .NET 6.
Per altre informazioni sul supporto delle funzionalità di anteprima, vedere la sezione relativa alle funzionalità di anteprima supportate.
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 ASP.NET Core. I problemi significativi vengono segnalati nel repository GitHub Annunci.
Requisiti HTTP/3
HTTP/3 ha requisiti diversi a seconda del sistema operativo. Se la piattaforma Kestrel in esecuzione in non ha tutti i requisiti per HTTP/3, è disabilitata e Kestrel eseguirà il fallback ad altri protocolli HTTP.
Finestre
- Windows 11 Build 22000 o versione successiva o Windows Server 2022.
- Connessione TLS 1.3 o successiva.
Linux
libmsquic
pacchetto installato.
libmsquic
viene pubblicato tramite il repository ufficiale dei pacchetti Linux di Microsoft all'indirizzo packages.microsoft.com
. Per installare questo pacchetto:
- Aggiungere il
packages.microsoft.com
repository. Per istruzioni, vedere Repository software Linux per prodotti Microsoft. - Installare il
libmsquic
pacchetto usando la gestione pacchetti della distribuzione. Ad esempio,apt install libmsquic=1.9*
in Ubuntu.
Nota: .NET 6 è compatibile solo con le versioni 1.9.x di libmsquic. Libmsquic 2.x non è compatibile a causa di modifiche di rilievo. Libmsquic riceve gli aggiornamenti alla versione 1.9.x quando sono necessari per incorporare correzioni di sicurezza.
macOS
HTTP/3 non è attualmente supportato in macOS e potrebbe essere disponibile in una versione futura.
Introduzione
HTTP/3 non è abilitato per impostazione predefinita. Aggiungere la configurazione a per Program.cs
abilitare HTTP/3.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
Il codice precedente configura la porta 5001 per:
- Usare HTTP/3 insieme a HTTP/1.1 e HTTP/2 specificando
HttpProtocols.Http1AndHttp2AndHttp3
. - Abilitare HTTPS con
UseHttps
. HTTP/3 richiede HTTPS.
Poiché non tutti i router, i firewall e i proxy supportano correttamente HTTP/3, HTTP/3 deve essere configurato insieme a HTTP/1.1 e HTTP/2. A tale scopo, è possibile specificare HttpProtocols.Http1AndHttp2AndHttp3
come protocolli supportati da un endpoint.
Per altre informazioni, vedere Configurare gli endpoint per il server Web ASP.NET CoreKestrel.
Alt-svc
HTTP/3 viene individuato come aggiornamento da HTTP/1.1 o HTTP/2 tramite l'intestazione alt-svc
. Ciò significa che la prima richiesta userà normalmente HTTP/1.1 o HTTP/2 prima di passare a HTTP/3. Kestrel aggiunge automaticamente l'intestazione alt-svc
se HTTP/3 è abilitato.
Test localhost
I browser non consentono certificati autofirmato su HTTP/3, ad esempio il Kestrel certificato di sviluppo.
HttpClient
può essere usato per i test localhost/loopback in .NET 6 o versione successiva. È necessaria una configurazione aggiuntiva quando si usaHttpClient
per effettuare una richiesta HTTP/3:- Impostare su
HttpRequestMessage.Version
3.0 o - Impostare
HttpRequestMessage.VersionPolicy
suHttpVersionPolicy.RequestVersionOrHigher
.
- Impostare su
Limiti
Alcuni scenari HTTPS non sono ancora supportati per HTTP/3 in Kestrel. Quando si chiama Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
con HttpsConnectionAdapterOptions durante l'uso di HTTP/3, l'impostazione delle opzioni seguenti in HttpsConnectionAdapterOptions è no-op (non esegue alcuna operazione):
La chiamata alle implementazioni seguenti di Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
genera un errore quando si usa HTTP/3:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
Vantaggi di HTTP/3
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 nuova tecnologia di trasporto sviluppata insieme a HTTP/3 denominata QUIC.
HTTP/3 e QUIC presentano diversi vantaggi rispetto a HTTP/1.1 e HTTP/2:
- Tempo di risposta più rapido della 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 influisce 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 perché 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 reti. 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. Kestrel non supporta le transizioni di rete in .NET 6. Il supporto potrebbe essere disponibile in una versione futura.