Использовать 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
этого можно указать следующее:
- HttpRequestMessage.Version равным 1.1.
- HttpRequestMessage.VersionPolicy изменено на HttpVersionPolicy.RequestVersionOrHigher.
Зависимости платформы
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.