Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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 у пул для зменшення споживання ресурсів. Коли ви створюєте новий екземпляр HttpClient, ви можете повторно використовувати екземпляр HttpMessageHandler у пулі, якщо термін життя ще не закінчився.

{
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "РеалізаціяТип": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "РеалізаціяТип": "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 Детальне пояснення основного проміжного програмного забезпечення
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 Ядро (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 09: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