Compartilhar via


Usar HTTP/3 com HttpClient

HTTP/3 é a terceira versão principal padronizada recentemente do HTTP. O 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 HTTP/1.1 quanto HTTP/2 usam TCP como transporte. HTTP/3 usa uma tecnologia de transporte desenvolvida junto 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 alcança o servidor mais rapidamente.
  • Experiência aprimorada quando há perda de pacote de conexão. O HTTP/2 multiplexa várias solicitações por meio de uma conexão TCP. A perda de pacote na conexão afeta todas as solicitações. Esse problema é chamado de "bloqueio de cabeçalho". Como o QUIC fornece multiplexação nativa, os pacotes perdidos afetam apenas as solicitações em que os dados foram perdidos.
  • Dá suporte à transição entre redes. Esse recurso é útil para dispositivos móveis em que é comum alternar entre redes WIFI e celulares à medida que 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 as solicitações HTTP com falha. O HTTP/3 permite que o aplicativo ou navegador da Web continue perfeitamente quando uma rede é alterada. HttpClient e o Kestrel não dão suporte a transições de rede no .NET 7. Eles pode estar disponíveis em uma versão futura.

Importante

Os aplicativos configurados para aproveitar HTTP/3 devem ser projetados para também dar suporte a HTTP/1.1 e HTTP/2. Se os problemas forem identificados em HTTP/3, é recomendável desabilitar HTTP/3 até que os problemas sejam resolvidos em uma versão futura do .NET.

Configurações do HttpClient

A versão HTTP pode ser configurada definindo HttpRequestMessage.Version como 3.0. No entanto, como nem todos os roteadores, firewalls e proxies dão suporte adequado a HTTP/3, é recomendável configurar HTTP/3 junto com HTTP/1.1 e HTTP/2. Em HttpClient, isso pode ser feito especificando:

Dependências de plataforma

HTTP/3 usa QUIC como seu protocolo de transporte. A implementação do .NET de HTTP/3 usa o MsQuic para fornecer funcionalidade QUIC. Como resultado, o suporte ao .NET de HTTP/3 depende dos requisitos da plataforma MsQuic. Para obter mais informações sobre como instalar o MsQuic, consulte as dependências da Plataforma QUIC. Se a plataforma na qual o HttpClient está em execução não tiver todos os requisitos para HTTP/3, ela será desabilitada.

Usando 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, 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 em HTTP/3 com .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 nó RuntimeHostConfigurationOption no arquivo de projeto para habilitar o HTTP/3 com HttpClient:

<ItemGroup>
    <RuntimeHostConfigurationOption Value="true"
        Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>

Como alternativa, você pode chamar System.AppContext.SetSwitch do código do aplicativo ou definir a variável de DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT ambiente como true. Para obter mais informações, consulte variáveis de ambiente do .NET: DOTNET_SYSTEM_NET_HTTP_*.

O motivo para exigir um sinalizador de configuração para HTTP/3 é proteger os aplicativos contra interrupções futuras ao usar a política RequestVersionOrHigherde 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 depois que o .NET 6 for liberado.

O .NET 6 só é compatível com as versões 1.9.x do libmsquic. O Libmsquic 2.x não é compatível com o .NET 6 devido a alterações significativas na biblioteca. O Libmsquic receberá atualizações para 1.9.x quando necessário para incorporar correções de segurança.

Servidor HTTP/3

O HTTP/3 tem suporte ASP.NET com o servidor Kestrel no .NET 6 (como uma versão prévia) e o .NET 7 (tem suporte total). Para obter mais informações, consulte usar HTTP/3 com o servidor Web ASP.NET Core Kestrel.

Servidores de teste públicos

O Cloudflare hospeda um site para HTTP/3 que pode ser usado para testar o cliente em https://cloudflare-quic.com.

Consulte também