При изграждане на приложение с 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 с 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.
За повече употреба и конфигурация, моля, вижте с:
Входът към хиперлинк е видим.
Входът към хиперлинк е видим.
|