Требования: Большинство сайтов сейчас в основном используют протоколы версий 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, как показано на рисунке ниже:
Ссылка:
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден. |