Использовать HTTP/3 с HttpClient

HTTP/3 является третьей и недавно стандартизованной основной версией HTTP. HTTP/3 использует ту же семантику, что и HTTP/1.1 и HTTP/2: те же методы запроса, коды состояния и поля сообщений применяются ко всем версиям. Разница заключается в базовой транспортировке. HTTP/1.1 и HTTP/2 используют TCP в качестве транспорта. HTTP/3 использует технологию транспорта, разработанную вместе с HTTP/3 под названием QUIC.

HTTP/3 и QUIC имеют несколько преимуществ по сравнению с HTTP/1.1 и HTTP/2:

  • Быстрое время отклика для первого запроса. QUIC и HTTP/3 согласовывают подключение в меньшем количестве круговых путей между клиентом и сервером. Первый запрос быстрее достигает сервера.
  • Улучшена возможность потери пакетов подключения. HTTP/2 выполняет мультиплексирование нескольких запросов через одно TCP-соединение. Потеря пакетов в соединении влияет на все запросы. Эта проблема называется блокировкой очереди. Так как QUIC предоставляет собственный мультиплексирование, потерянные пакеты влияют только на запросы, в которых данные были потеряны.
  • Поддерживает переход между сетями. Эта функция полезна для мобильных устройств, где обычно переключаться между WIFI и сотовыми сетями в качестве расположения изменений мобильных устройств. В настоящее время подключения HTTP/1.1 и HTTP/2 завершаются ошибкой при переключении сетей. Приложение или веб-браузер должны повторить все невыполненные HTTP-запросы. HTTP/3 позволяет приложению или веб-браузеру без перебоев продолжить работу при изменении сети. HttpClient и Kestrel не поддерживают сетевые переходы в .NET 7. Эта возможность может быть доступна в следующем выпуске.

Внимание

Приложения, настроенные на использование преимуществ HTTP/3, должны поддерживать протоколы HTTP/1.1 и HTTP/2. Если проблемы определены в протоколе HTTP/3, рекомендуется отключить HTTP/3, пока проблемы не будут устранены в будущем выпуске .NET.

Параметры HttpClient

Версию HTTP можно настроить, задав значение HttpRequestMessage.Version равным 3.0. Однако, так как не все маршрутизаторы, брандмауэры и прокси-серверы правильно поддерживают ПРОТОКОЛ HTTP/3, рекомендуется настроить HTTP/3 вместе с HTTP/1.1 и HTTP/2. Для HttpClientэтого можно указать следующее:

Зависимости платформы

HTTP/3 использует QUIC в качестве транспортного протокола. В реализации .NET для HTTP/3 используется MsQuic для предоставления функциональных возможностей QUIC. В результате поддержка .NET http/3 зависит от требований платформы MsQuic. Дополнительные сведения об установке MsQuic см. в разделе "Зависимости платформы QUIC". Если платформа, на которую работает HttpClient, не имеет всех требований для HTTP/3, то она отключена.

Использование HttpClient

В следующем примере кода используются операторы верхнего уровня и демонстрируется способ указания HTTP3 в запросе.

// 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))}");

Поддержка HTTP/3 в .NET 6

В .NET 6 http/3 доступен в качестве предварительной версии функции , так как спецификация HTTP/3 еще не завершена. Проблемы с поведением или производительностью могут существовать в HTTP/3 с .NET 6. Дополнительные сведения о предварительных версиях функций см. в этой спецификации.

Чтобы включить поддержку HTTP/3 в .NET 6, включите RuntimeHostConfigurationOption узел в файл проекта, чтобы включить http/3 с:HttpClient

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

Кроме того, можно вызвать System.AppContext.SetSwitch из кода приложения или задать для переменной DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT среды значение true. Дополнительные сведения см . в разделе переменных среды .NET: DOTNET_SYSTEM_NET_HTTP_*.

Флаг конфигурации обязателен для HTTP/3, поскольку необходимо защитить приложения от сбоя в будущем при использовании политики управления версиями RequestVersionOrHigher. При вызове сервера, в настоящее время использующего протокол HTTP/1.1 и HTTP/2, если сервер позже обновляется до HTTP/3, клиент попытается использовать HTTP/3 и потенциально несовместим, так как стандарт не является окончательным и поэтому может измениться после выпуска .NET 6.

.NET 6 совместим только с версиями libmsquic версии 1.9.x. Libmsquic 2.x несовместим с .NET 6 из-за критических изменений в библиотеке. Libmsquic получает обновления до версии 1.9.x при необходимости добавления исправлений безопасности.

Сервер HTTP/3

HTTP/3 поддерживается ASP.NET с сервером Kestrel в .NET 6 (предварительная версия) и .NET 7 (полностью поддерживается). Дополнительные сведения см. в разделе Использование HTTP/3 с веб-сервером Kestrel для ASP.NET Core.

Общедоступные тестовые серверы

Cloudflare размещает сайт для HTTP/3, который можно использовать для тестирования клиента https://cloudflare-quic.com.

См. также