Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 537|Ответ: 1

[Источник] HttpClient в .NET/C# использует протокол версии Http/2.0

[Скопировать ссылку]
Опубликовано 2025-8-31 21:16:47 | | | |
Требования: Большинство сайтов сейчас в основном используют протоколы версий Http/1.1 и Http/2.0; для сайтов, поддерживающих только версию протокола HTTP/2, используя HttpClient для отправки запросов по умолчанию, будет выдавать System.Net.Http.Http.HttpRequestException: При отправке запроса произошла ошибка. ---> System.IO.IOException: Не удаётся прочитать данные с транспортного соединения: Программное обеспечение вашего хоста прервало установленное соединение. ---> System.Net.Sockets.SocketException (10053): Программное обеспечение на вашем хосте прерывает установленное соединение. на System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, булев forAsyncThrow).

История протокола HTTP

Хронология



HTTP/0.9

Устаревшая версия HTTP/0.9 была первой версией протокола HTTP, появившейся в 1989 году. Это чрезвычайно просто: клиенту может отправить запрос GET и не поддерживает заголовок запроса. Поскольку нет заголовка протокола, HTTP/0.9 может поддерживать только один тип контента — обычный текст. Сервер может отвечать только на строки в формате HTML, но не на другие форматы. Когда сервер завершает отправку, TCP-соединение закрывается.
HTTP/0.9 имеет типичную безсостоятельность, при которой каждый визит обрабатывается независимо и отключается после завершения обработки. Если запрошенная страница не существует, коды ошибок не возвращаются.

HTTP/1

HTTP/1 — это совокупный термин для HTTP 1.0 и HTTP 1.1, который относится к версиям протокола HTTP 1.0 и 1.1 соответственно.
HTTP 1.0 была второй версией протокола HTTP и до сих пор широко применяется. Компания внесла ряд улучшений и улучшений на базе HTTP/0.9, включая:

Можно отправлять больше форматов, таких как изображения, видео, бинарные файлы, помимо простого текста
Кроме того, были добавлены методы запроса POST
Изменил формат HTTP-запросов и ответов. В дополнение к части с данными, каждая коммуникация должна содержать HTTP-заголовок, описывающий некоторые метаданные, то есть добавляется информация о заголовке запроса
Добавлены функции, такие как код статуса ответа, поддержка множества символов, авторизация, кэш и кодирование контента
Хотя это всё ещё бессостоятельный протокол, длинные соединения можно поддерживать, добавив заголовок «Connection: keep-alive» к запросу

HTTP 1.1

HTTP 1.1 — это стандартизированный протокол, и HTTP 1.1 устраняет множество неоднозначностей и вносит ряд улучшений.

особенность

Обработка кэша, HTTP 1.1 вводит больше политик управления кэшом, такие как тег сущности, If-Unmodified-Since, If-Match, If-None-Match и т.д., а также дополнительные дополнительные заголовки кэша для управления политикой кэша.
Оптимизация пропускной способности и использование сетевых соединений вводят диапазон в заголовок запроса, который позволяет запросить только одну часть ресурса, то есть вернуть статус 206, что облегчает разработчикам свободное использование пропускной способности и связей, а также возможность использовать диапазон и содержимый диапазон для создания функции возобновления точки остановки.
Управление уведомлениями об ошибках, добавлено 24 новых кода статуса ошибок в HTTP 1.1.
Добавление заголовка Host позволяет настраивать разные доменные имена на серверах с одним и тем же IP-адресом.
Поддержка длинных соединений, HTTP 1.1 поддерживает длинные соединения, множество HTTP-запросов и ответов могут передаваться по TCP-соединению, что снижает потребление и задержки при установлении и закрытии соединений, а Connection:keep-alive по умолчанию включен в HTTP 1.1, а в обычных браузерах можно одновременно устанавливать 6 длинных ссылок для одного и того же доменного имени.
Добавлена технология конвейерной линии, позволяющая отправить второй запрос до полной отправки первого ответа для улучшения блокировки очередей, но порядок ответов всё равно будет возвращаться в порядке запросов.
Поддерживайте фрагментирование отклика, установив Transfer-Encoding: chunked for chunked response, что позволяет разделить данные отклика на несколько частей, а сервер может как можно скорее освободить буфер для повышения скорости отклика.

HTTP 2.0

HTTP 2.0 обеспечивает лучшую производительность, и теперь веб-страницы становятся всё сложнее и даже превращаются в уникальные приложения, количество воспроизведения медиа, размер скриптов для улучшения взаимодействия также значительно увеличился, а также больше данных передаётся через HTTP-запросы, поэтому HTTP 2.0 внес множество оптимизаций для эффективности сети.

особенность

Разделение двоичных кадров, HTTP 2.0 — это двоичный протокол, а не текстовый, который разбивает всю передаваемую информацию на меньшие сообщения и кадры и кодирует их в бинарном формате.
Мультиплексирование, параллельные запросы могут обрабатываться по одной и той же ссылке, все обращения под одним доменным именем осуществляются с одного и того же TCP-соединения, HTTP-сообщения разбиваются на независимые кадры, а сервер собирает сообщения по идентификаторам и заголовкам, устраняя ограничения порядка и блокировки в HTTP 1.1.
Сжатие заголовков, которые часто схожи в серии запросов, снижает затраты на дублирование и передачу дублирующихся данных.
Серверный push позволяет проактивно отправлять ресурсы клиенту без явного запроса со стороны клиента.

HTTP 3.0

HTTP 3.0 сейчас находится на стадии формулировки и тестирования, это новый HTTP-протокол в будущем, протокол HTTP 3.0 работает поверх протокола QUIC, основан на UDP для обеспечения надёжной передачи, компромисса со скоростью передачи и надежности передачи, а также оптимизации, использование UDP позволит избежать проблемы блокировки очереди TCP и ускорить скорость передачи в сети, но также необходимо обеспечить надёжный механизм передачи, HTTP 3.0 не является расширением HTTP 2.0, HTTP 3.0 станет совершенно новым протоколом.

HttpClientHandler VS SocketsHttpHandler

Стандартным обработчиком сообщений, используемым HttpClient в .NET Framework и .NET Core 2.0 и более ранних версиях, является HttpClientHandler.

Начиная с .NET Core 2.1, курсыSocketsHttpHandler предоставляет более высокоуровневый класс HTTP-сетей(например, HttpClient). Использование SocketsHttpHandler даёт множество преимуществ:

Производительность значительно улучшилась по сравнению с предыдущими реализациями.
Устранить зависимости от платформы для упрощения развертывания и обслуживания. Например, libcurl больше не зависит от .NET Core для macOS и .NET Core для Linux.
Последовательное поведение на всех платформах .NET.

В .NET 9 HttpClientFactory использует SocketsHttpHandler в качестве основного обработчика

HttpClientFactory позволяет настраивать конвейеры HttpClient для именованных и типизированных объектов HttpMessageHandler. Внутренний обработчик или обработчик, который фактически отправляет запросы в сети, называется главным обработчиком. Если он не настроен, этот обработчик раньше всегда был HttpClientHandler. Хотя по умолчанию мастер-обработчик — это детали реализации, есть пользователи, которые на него полагаются. Например, некоторые пользователи используют основной обработчик в свойства настроек HttpClientHandler, такие как ClientCertificates, UseCookies и UseProxy.

Связь:Вход по гиперссылке виден.

Глобальная конфигурация запрашивает версию протокола HTTP

Код таков:

DefaultRequestVersionНастройка по умолчанию — HttpVersion.Version11

Свойство DefaultRequestVersion указывает HTTP-версию по умолчанию для запросов, отправленных через этот экземпляр HttpClient, когда он строит HttpRequestMessage для отправки, в частности, вызывая 、、、GetStreamAsyncGetAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsync и PutAsync.

Свойство DefaultRequestVersionНе применимо к методу SendAsync。 Параметр HttpRequestMessage, передаваемый методу SendAsync как параметр, имеет собственное свойство Version, которое управляет HTTP-версией для запроса.

Связь:Вход по гиперссылке виден.

Политику переговоров по HttpVersionPolicy

RequestVersionOrLower: Используйте запрошенную версию или понижайте версию до более низкой (но не выше запрошенной). Это поведение по умолчанию. Проще говоря, самая часто используемая версия протокола — это текущая версия, и если текущая версия протокола не поддерживается, она будет понижена.
RequestVersionOrHigher: Используйте самую высокую версию, поддерживаемую сервером, но не ниже запрашиваемой версии. То есть разрешены улучшения, а понижения ниже запрашиваемой версии не допускаются. Проще говоря, используйте более высококлассные протоколы для коммуникации, когда это возможно.
RequestVersionExact: Используйте строго запрошенную версию, никаких улучшений или понижений класса не допускаются.

HttpClient использует протокол версии Http/2.0

Тестовый код следующий:

Запрос использует версию 1.1, и финальный клиент и сервер договариваются о применении протокола 2.0 для общения, поэтому окончательный ответ — версия 2.0, как показано на рисунке ниже:



Ссылка:

Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден.




Предыдущий:Хранилище MinIO (iii) Копирование-загрузка (миграция) локальных файлов в minio bucket
Следующий:.NET/C# конвертирует PDF в изображения на основе ImageMagick и GhostScript
 Хозяин| Опубликовано 31.08.2025 21:46:27 |
Запрос отменён: не удалось создать решение для защищённого канала SSL/TLS
https://www.itsvse.com/thread-7612-1-1.html
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com