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

Вид: 9666|Ответ: 7

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

[Скопировать ссылку]
Опубликовано 14.05.2022 19:37:21 | | | |
При создании приложения с ASP.NET экземпляр класса HttpClient используется для создания HTTP-запроса. Использование HttpClient может показаться простым. Однако некоторые потенциальные проблемы не замечаются, пока приложение не оказывается под сильной нагрузкой.

Проблемы, связанные с оригинальным классом HttpClient, предоставленным в .NET:Вход по гиперссылке виден.

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

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



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

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

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

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

Не удаётся подключиться к удалённому серверу
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Для вопросов вы также можете обратиться к:

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

С помощью инъекции зависимостей DI IHttpClientFactory работает аналогично HttpLinet, который создаётся с помощью IHttpClientFactory.

Добавьте сервис в файл запуска, код выглядит следующим образом:

Код контроллера HomeController следующий:

Мы также используем HttpClinet для отправки 5 запросов через интерфейс вызова, и машина устанавливает соединение только с целевым сервером, и соединение повторно используется в процессе запроса. Как показано ниже:



IHttpClientFactory объединяет заводские экземпляры HttpMessageHandler в пул для снижения потребления ресурсов. При создании нового экземпляра HttpMessageHandler вы можете повторно использовать экземпляр HttpMessageHandler в пуле, если срок жизни ещё не истёк.

{
    «Lifetime»: «Singleton»,
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    «Lifetime»: «Singleton»,
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory реализуется по умолчанию как DefaultHttpClientFactory с адресом исходного кода:Вход по гиперссылке виден.

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

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


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

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


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

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


Для получения дополнительной информации и настройки, пожалуйста, обратитесь к следующему:

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





Предыдущий:Неправильное использование HttpClient может повредить ваше программное обеспечение
Следующий:Плагин интернационализации jQuery Datatables
 Хозяин| Опубликовано 14.05.2022 19:38:14 |
обзор

ASP.NET Core (четырнадцать) основана на капче изображения SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII), чтобы определить, является ли это запросом Ajax
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (двенадцать) фронтенд JS, объединение CSS и компрессия
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Маршрут конечной точки Core (XI) добавляет промежуточное ПО для отображения всех сервисов DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Подробное объяснение приоритетов конфигурации в Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Подробное объяснение промежуточного программного обеспечения Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Подробное объяснение Core Middleware
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET яма стандартных параметров интерфейса Swagger в Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core (7) Глубокий анализ исходного кода фреймворка
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI вручную получает метод введения объектов
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (пять) основана на распределённых транзакциях с CAP
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Фильтр Core(4) унифицированная валидация модели ModelState
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Ядро (iii) Динамическое создание экземпляров с помощью ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Перезапустить приложение по коду
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) использует кэширование Redis
https://www.itsvse.com/thread-9393-1-1.html
 Хозяин| Опубликовано 14.05.2022 19:41:13 |
Исходный код HttpClientHandler:https://github.com/dotnet/runtim ... andler.AnyMobile.cs
Исходный код SocketsHttpHandler:https://github.com/dotnet/runtim ... obalHttpSettings.cs
Опубликовано 14.05.2022 22:36:06 |
Учитесь
Опубликовано 19.05.2022 9:45:12 |
Вот оно, посмотрите продолжение
Опубликовано 18.08.2022 16:13:45 |
Потрясающее обучение и обучение
 Хозяин| Опубликовано 24.06.2023 13:07:32 |
.NET/C# Простой анализ исходного кода HttpClient
https://www.itsvse.com/thread-10617-1-1.html
 Хозяин| Опубликовано 05.09.2024 14:35:55 |
Посмотрите исходный код HttpClientFactoryServiceCollectionExtensions

Стандартная реализация IHttpClientFactory —DefaultHttpClientFactory, как показано на рисунке ниже:



Метод CreateClient в DefaultHttpClientFactory создаёт объект HttpClientdisposeHandler: false, как показано на рисунке ниже:



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

Mail To:help@itsvse.com