Use HTTP/3 com HttpClient
HTTP/3 é a terceira e recentemente padronizada versão principal do HTTP. HTTP/3 usa a mesma semântica que HTTP/1.1 e HTTP/2: os mesmos métodos de solicitação, códigos de status e campos de mensagem se aplicam a todas as versões. As diferenças estão no transporte subjacente. Tanto o HTTP/1.1 quanto o HTTP/2 usam TCP como transporte. HTTP/3 usa uma tecnologia de transporte desenvolvida juntamente com HTTP/3 chamada QUIC.
HTTP/3 e QUIC têm vários benefícios em comparação com HTTP/1.1 e HTTP/2:
- Tempo de resposta mais rápido para a primeira solicitação. QUIC e HTTP/3 negociam a conexão em menos viagens de ida e volta entre o cliente e o servidor. A primeira solicitação chega ao servidor mais rapidamente.
- Experiência melhorada quando há perda de pacotes de ligação. HTTP/2 multiplexa várias solicitações através de uma conexão TCP. A perda de pacotes na conexão afeta todas as solicitações. Este problema é chamado de "bloqueio de cabeça de linha". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
- Suporta a transição entre redes. Este recurso é útil para dispositivos móveis onde é comum alternar entre Wi-Fi e redes celulares quando um dispositivo móvel muda de local. Atualmente, as conexões HTTP/1.1 e HTTP/2 falham com um erro ao alternar redes. Um aplicativo ou navegador da Web deve repetir todas as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue sem problemas quando uma rede muda. HttpClient e Kestrel não suportam transições de rede no .NET 7. Ele pode estar disponível em uma versão futura.
Importante
Os aplicativos configurados para aproveitar o HTTP/3 devem ser projetados para também suportar HTTP/1.1 e HTTP/2. Se os problemas forem identificados no HTTP/3, é recomendável desativar o HTTP/3 até que os problemas sejam resolvidos em uma versão futura do .NET.
Configurações de HttpClient
A versão HTTP pode ser configurada definindo HttpRequestMessage.Version
como 3.0. No entanto, como nem todos os roteadores, firewalls e proxies suportam corretamente HTTP/3, é recomendável configurar HTTP/3 junto com HTTP/1.1 e HTTP/2. Na HttpClient
, isso pode ser feito especificando:
- HttpRequestMessage.Version até 1.1.
- HttpRequestMessage.VersionPolicy a HttpVersionPolicy.RequestVersionOrHigher.
Dependências da plataforma
HTTP/3 usa QUIC como seu protocolo de transporte. A implementação .NET do HTTP/3 usa o MsQuic para fornecer a funcionalidade QUIC . Como resultado, o suporte .NET de HTTP/3 depende dos requisitos da plataforma MsQuic. Para obter mais informações sobre como instalar o MsQuic, consulte Dependências da plataforma QUIC. Se a plataforma em que o HttpClient está sendo executado não tiver todos os requisitos para HTTP/3, ela será desativada.
Utilizar HttpClient
O exemplo de código a seguir usa instruções de nível superior e demonstra como especificar HTTP3 na solicitação:
// 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))}");
Suporte a HTTP/3 no .NET 6
No .NET 6, o HTTP/3 está disponível como um recurso de visualização porque a especificação HTTP/3 ainda não foi finalizada. Problemas comportamentais ou de desempenho podem existir no HTTP/3 com o .NET 6. Para obter mais informações sobre recursos de visualização, consulte a especificação de recursos de visualização.
Para habilitar o suporte a HTTP/3 no .NET 6, inclua o RuntimeHostConfigurationOption
nó no arquivo de projeto para habilitar HTTP/3 com HttpClient
:
<ItemGroup>
<RuntimeHostConfigurationOption Value="true"
Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>
Como alternativa, você pode chamar System.AppContext.SetSwitch a partir do código do seu aplicativo ou definir a DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT
variável de ambiente como true
. Para obter mais informações, consulte Variáveis de ambiente .NET: DOTNET_SYSTEM_NET_HTTP_*.
A razão para exigir um sinalizador de configuração para HTTP/3 é proteger os aplicativos de quebras futuras ao usar a política RequestVersionOrHigher
de versão. Ao chamar um servidor que atualmente usa HTTP/1.1 e HTTP/2, se o servidor atualizar posteriormente para HTTP/3, o cliente tentará usar HTTP/3 e potencialmente será incompatível, pois o padrão não é final e, portanto, pode mudar após o lançamento do .NET 6.
O .NET 6 só é compatível com as versões 1.9.x da libmsquic. O Libmsquic 2.x não é compatível com o .NET 6 devido a alterações significativas na biblioteca. O Libmsquic recebe atualizações para 1.9.x quando necessário para incorporar correções de segurança.
Servidor HTTP/3
HTTP/3 é suportado pelo ASP.NET com o servidor Kestrel no .NET 6 (como uma visualização) e .NET 7 (é totalmente suportado). Para obter mais informações, consulte Usar HTTP/3 com o servidor Web ASP.NET Core Kestrel.
Servidores de teste públicos
A Cloudflare hospeda um site para HTTP/3 que pode ser usado para testar o cliente em https://cloudflare-quic.com.