Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 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 dependency injection, IHttpClientFactory е същият като HttpLinet, който се създава с помощта на IHttpClientFactory.

Добавете услугата към файла Startup, кодът е следният:

Кодът на контролера HomeController е следният:

Също така използваме HttpClinet за изпращане на 5 заявки през интерфейса за повикване, като машината установява връзка само с целевия сървър, а връзката се използва повторно по време на процеса на заявка. Както е показано по-долу:



IHttpClientFactory обединява фабрично създадени HttpMessageHandler инстанции в пул, за да намали потреблението на ресурси. Когато създадете нов HttpClient инстанс, можете да използвате 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 Подробно обяснение на основния междинен софтуер
https://www.itsvse.com/thread-8126-1-1.html

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

ASP.NET Ядро (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 г. 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
 Хазяин| Публикувано в 5.09.2024 г. 14:35:55 ч. |
Разгледайте изходния код на HttpClientFactoryServiceCollectionExtensions

Стандартната реализация на IHttpClientFactory еDefaultHttpClientFactory, както е показано на фигурата по-долу:



Методът CreateClient в DefaultHttpClientFactory инстанцира обекта HttpClientdisposeHandler: false, както е показано на фигурата по-долу:



Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com