Pri vytváraní aplikácie s ASP.NET sa inštancia triedy HttpClient používa na vykonanie HTTP požiadavky. Používanie HttpClient sa môže zdať jednoduché. Niektoré potenciálne problémy si však všimnete až vtedy, keď je aplikácia zaťažená.
Problémy súvisiace s pôvodnou triedou HttpClient poskytovanou v .NET:Prihlásenie na hypertextový odkaz je viditeľné.
HttpClient, pri implementácii IDisposable, deklarácii a inštancovaní v príkaze using nie je preferovaná operácia, pretožePri uvoľnení objektu HttpClient základný socket nieokamžiteuvoľnenie, čo môže spôsobiť problémy s vyčerpaním lôžkov.
Problémom nie je samotný HttpClient, ale predvolený konštruktér HttpClientu, pretože vytvára novú skutočnú inštanciu HttpMessageHandleru s vyššie spomenutými problémami so "vyčerpaním socketu" a zmenou DNS.
Priame vytvorenie HttpClient (nesprávne použitie)
Inštancujte priamo objekt HttpClient a pridajte using na zaručenie volania metódy Dispose, kód je nasledovný:
Volajte rozhranie 5-krát, odošlite HTTP požiadavku pomocou HttpClient a skontrolujte sieťové pripojenie nasledujúcim príkazom:
Vidíte, že keď je HttpClient uvoľnený, spojenie medzi lokálnym počítačom a cieľovým serverom jeTIME_WAITV prípade vysokej súbežnosti bude chyba hlásená nasledovne:
Nepodarilo sa pripojiť k vzdialenému serveru
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Pre otázky sa môžete pozrieť aj na:
Vytvorte HttpClinet pomocou IHttpClientFactory (správne použitie)
Použitím DI dependency injection je IHttpClientFactory rovnaký ako HttpLinet, ktorý sa vytvára pomocou IHttpClientFactory.
Pridajte službu do súboru Startup, kód je nasledovný:
Kód ovládača HomeController je nasledovný:
Používame tiež HttpClinet na odoslanie 5 požiadaviek cez rozhranie volania, pričom stroj nadviaže spojenie iba s cieľovým serverom, pričom spojenie sa počas procesu požiadavky znovu použije. Ako je uvedené nižšie:
IHttpClientFactory zoskupuje továrensky vytvorené inštancie HttpMessageHandleru do jedného poolu, aby znížil spotrebu zdrojov. Keď vytvoríte novú inštanciu HttpClient, môžete inštanciu HttpMessageHandler v poole znovu použiť, ak životnosť ešte nevypršala.
{ "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 je štandardne implementovaný ako DefaultHttpClientFactory s adresou zdrojového kódu:Prihlásenie na hypertextový odkaz je viditeľné.
Použitím IHttpClientFactory v aplikácii s podporou DI sa môžete vyhnúť:
- Vyriešiť problém vyčerpania zdrojov zdieľaním inštancie HttpMessageHandler.
- Vyriešiť zastaranosť DNS pravidelným opakovaním cez inštancie HttpMessageHandler.
Okrem toho existujú aj iné spôsoby, ako riešiť vyššie uvedené problémy pomocou inštancií SocketsHttpHandler s dlhou životnosťou.
- Vytvorte inštanciu SocketsHttpHandler pri štarte aplikácie a používajte ju počas celého životného cyklu aplikácie.
- Nastavte PooledConnectionLifetime na príslušnú hodnotu na základe času obnovy DNS.
- Vytvorte inštanciu HttpClient pomocou nového HttpClient(handler, disposeHandler: false) podľa potreby.
Vyššie uvedený prístup rieši problémy správy zdrojov podobne ako IHttpClientFactory.
- SocketsHttpHandler medzi inštanciami HttpClientZdieľané spojenia。 Toto zdieľanie zabraňuje vyčerpaniu zásuvky.
- SocketsHttpHandler slučí spojenia na základe PooledConnectionLifetime, aby sa predišlo zastaranosti DNS.
Pre viac využitia a konfigurácie pozrite si:
Prihlásenie na hypertextový odkaz je viditeľné.
Prihlásenie na hypertextový odkaz je viditeľné.
|