Поделиться через


Использование 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 предоставляет встроенное мультиплексирование, потерянные пакеты влияют только на те запросы, где были потеряны данные.
  • Поддерживает переход между сетями. Эта функция полезна для мобильных устройств, где обычно переключаются между сетями Wi-Fi и сотовыми, когда мобильное устройство меняет расположение. В настоящее время подключения 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 Server

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

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

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

См. также