架构师_程序员_码农网

Имя пользователя Получить пароль
Регистрация

QQ登录

Всего один шаг, чтобы начать

Поиск
Просмотр:4019|Ответ: 7
打印 上一主题 下一主题

[Архив]ASP.NET Core (XV) Использование HttpClient для отправки HTTP-запросов

[Копировать ссылку]
Поднимайте прямо к 跳转到指定楼层
владелец
发表于 2022-5-14 19:37:21|只看该作者回帖奖励|Реверсивныйпросмотр|Режим чтения
При создании приложений с помощью ASP.NET HTTP-запросы выполняются с помощью экземпляров класса HttpClient. Использование HttpClient может показаться простым. Однако только когда приложение испытывает большую нагрузку, можно заметить некоторые потенциальные проблемы.

Проблемы, связанные с оригинальным классом HttpClient, поставляемым в .NET: https: //docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use -httpclientfactory-to-implement-resilient-http-requests

Хотя HttpClient реализует IDisposable, объявление и инстанцирование его в операторе using не является предпочтительным действием, поскольку базовый сокет неосвобождаетсянемедленнопри освобождении объекта HttpClient, что может привести к проблемам с исчерпанием сокета.

Проблема на самом деле заключается не в самом HttpClient, а в конструкторе HttpClient по умолчанию, поскольку он создает новый экземпляр фактического HttpMessageHandler, который имеет проблемы с "исчерпанием сокета" и сменой DNS, упомянутые выше.



Создание HttpClient напрямую (неправильное использование)

Инстанцируйте объект HttpClient напрямую и добавьте using для обеспечения вызова метода Dispose, используя следующий код:

Вызвав интерфейс 5 раз, используйте HttpClient для отправки HTTP-запроса и проверки сетевого соединения следующей командой:

Видно, что при освобождении HttpClient соединение между локальным компьютером и целевым сервером находится в состоянии TIME_WAIT и не освобождается вовремя, а в случае высокого параллелизма будет выдана следующая ошибка:

Невозможно подключиться к удаленному серверу
System.Net.Sockets.SocketException: Обычно допускается только одно использование каждого адреса сокета (протокол/сетевой адрес/порт).


Что касается вопроса, см. также:

[Перевод] Неправильное использование HttpClinet может повредить ваше программное обеспечение.
h ttps:// www.itsvse.com/thread-10310-1-1.html
Создание HttpClinet с помощью IHttpClientFactory (правильное использование)

Используя инъекцию зависимостей DI, IHttpClientFactory и HttpClinet являются одним и тем же, в этой статье для создания HttpClinet используется IHttpClientFactory.

Добавьте службу в файл Startup со следующим кодом:

Код контроллера HomeController выглядит следующим образом:

Вызывая интерфейс, а также используя HttpClinet для отправки 5 запросов, локальная машина только устанавливает соединение с целевым сервером, и это соединение повторно используется во время запроса. На следующей диаграмме показано соединение, повторно используемое в процессе запроса:



IHttpClientFactory объединяет созданные на фабрике экземпляры HttpMessageHandler в пул для снижения потребления ресурсов. Экземпляры HttpMessageHandler в пуле могут быть повторно использованы при создании новых экземпляров HttpClient (если период выживания еще не истек).

{
"Lifetime": "Singleton",
"ServiceType": "System.Net.Http.IHttpClientFactory",
"ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
},
{
"Lifetime": "Singleton", "ServiceType": "Microsoft.Extensions.Http.
"ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", {
"ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
}
Реализацией IHttpClientFactory по умолчанию является DefaultHttpClientFactory, источник: https: //github.com/dotnet/runtime/blob/main/src/libraries/Microsoft. Extensions.Http/src/DefaultHttpClientFactory.cs

Этого можно избежать, используя IHttpClientFactory в приложениях с поддержкой DI:

  • Решение проблемы исчерпания ресурсов путем совместного использования экземпляров HttpMessageHandler.
  • Решение проблемы устаревания DNS путем периодического циклического использования экземпляров HttpMessageHandler.


Существуют и другие способы использования долгоживущих экземпляров SocketsHttpHandler для решения этих проблем.

  • создает экземпляр SocketsHttpHandler при запуске приложения и использует его на протяжении всего жизненного цикла приложения.
  • Настройте PooledConnectionLifetime на соответствующее значение, основанное на времени обновления DNS.
  • При необходимости создайте экземпляр HttpClient с помощью new HttpClient(handler, disposeHandler: false).


Приведенный выше подход решает проблему управления ресурсами аналогично тому, как ее решает IHttpClientFactory.

  • SocketsHttpHandler разделяет соединения между экземплярами HttpClient.
  • Такой обмен предотвращает исчерпание сокетов. SocketsHttpHandler зацикливает соединения на основе PooledConnectionLifetime, чтобы избежать проблем с устареванием DNS.


Подробнее об использовании и настройке см:

h ttps:// docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0
h ttps:// docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0





Предыдущий: [Перевод] Неправильное использование HttpClient разрушит ваше программное обеспечение!
Следующая: [Практическая] Плагин интернационализации jQuery Datatables
收藏转播分享Коллекции0 Эстафета
Код фермерской сети, только опубликованные в процессе практики, столкнулись с техническими трудностями, не вводите в заблуждение других.
Я не уверен, о чем я говорю, но я не уверен, о чем я говорю.
диван
楼主|发表于 2022-5-14 19:38:14|只看该作者
Обзор

ASP.NET Core (XIV) на основе SkiaSharp Image CAPTCHA
h ttps:// www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (xiii) Определение того, является ли запрос Ajax-запросом
h ttps:// www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (xii) Front-End JS, CSS Bundling and Compression
h ttps:// www.itsvse.com/thread-10282-1-1.html

ASP.NET Core (xi) Маршрутизация конечных точек Добавление промежуточного ПО для отображения всех DI-сервисов
h ttps:// www.itsvse.com/thread-10269-1-1.html

ASP.NET Core (x) Конфигурация Конфигурационные приоритеты в деталях
h ttps:// www.itsvse.com/thread-10265-1-1.html

ASP.NET Core (IX) Подробности о промежуточном ПО
h ttps:// www.itsvse.com/thread-9647-1-1.html

Подробное описание ASP.NET Core (Middleware) промежуточного ПО
h ttps:// www.itsvse.com/thread-8126-1-1.html

ASP.NET Core (8) - Яма параметров по умолчанию Swagger UI
h ttps:// www.itsvse.com/thread-9640-1-1.html

ASP.NET Core (VII) - Глубокое погружение в исходный код фреймворка
h ttps:// www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI Ручное получение инжектируемых объектов
h ttps:// www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (V) Распределенные транзакции на основе CAP
h ttps:// www.itsvse.com/thread-9593-1-1.html

ASP.NET Core (IV) фильтр унифицированной проверки модели ModelState
h ttps:// www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (III) Использование ActivatorUtilities для динамического создания экземпляров
h ttps:// www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (II) Самостоятельный перезапуск приложений с помощью кода
h ttps:// www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (I) Использование кэша Redis
h ttps:// www.itsvse.com/thread-9393-1-1.html
Код Фармера, публикуется только в процессе практики, столкнувшись с техническими трудностями, не вводите в заблуждение других.
сапоги угги продажа
скамейки
楼主|发表于 2022-5-14 19:41:13|只看该作者
HttpClientHandler Источник: https: //github.com/dotnet/runtim ... SocketsHttpHandler.AnyMobile.cs
SocketsHttpHandler Источник: https: //github.com/dotnet/runtim ... obalHttpSettings.cs
Код фермерской сети, публикуется только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
Ответить Запротив

Отчет

nike air max 90 pas cher
Я не уверен, что смогу это сделать.
Код фермерской сети, публикуется только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
5#
发表于 2022-5-19 09:45:12|只看该作者
Вот оно, вот оно, посмотрите на продолжение
Код фермерской сети, опубликован только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
6#
发表于 2022-8-18 16:13:45|只看该作者
Я не уверен, что смогу это сделать.
Кодекс фермерской сети, опубликован только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
сапоги угги продажа
7#
楼主|发表于 2023-6-24 13:07:32|只看该作者
NET/C# HttpClient Исходный код Простой анализ
h ttps:// www.itsvse.com/thread-10617-1-1.html
Код фермерской сети, публикуется только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
сапоги угги продажа
8#
楼主|发表于 2024-9-5 14:35:55|只看该作者
Просмотр исходного текста документа HttpClientFactoryServiceCollectionExtensions

Реализацией IHttpClientFactory по умолчанию является DefaultHttpClientFactory, как показано ниже:



Метод CreateClient в DefaultHttpClientFactory disposeHandler: false при инстанцировании объекта HttpClient, как показано ниже:



Код фермерской сети, опубликован только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
Вы должны войти в систему, прежде чем сможете отправлять сообщения назад Войти | Зарегистрироваться

Эта версия интегральных правил


DISCLAIMER: Все программное обеспечение, материалы по программированию или статьи, опубликованные Code Farmer, предназначены только для использования в учебных и исследовательских целях; вышеуказанное содержимое не должно использоваться в коммерческих или незаконных целях, в противном случае все последствия будут возложены на самих пользователей. Это сайт информации из сети, спор об авторских правах не имеет никакого отношения к этому сайту. Вы должны полностью удалить вышеуказанное содержимое со своего компьютера в течение 24 часов после загрузки. Если вам понравилась программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшее подлинное обслуживание. Если есть какие-либо нарушения, пожалуйста, свяжитесь с нами по электронной почте, чтобы разобраться с этим.

Почта To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-18 16:44

Быстрый ответНазад к началуНазад к списку