Amikor ASP.NET-vel alkalmazást építünk, a HttpClient osztály egy példányát használják HTTP kérés elkészítésére. A HttpClient használata egyszerűnek tűnhet. Azonban néhány lehetséges problémát csak akkor veszítenek észre, ha az alkalmazás nagy terhelés alatt áll.
Az eredeti .NET HttpClient osztályhoz kapcsolódó problémák:A hiperlink bejelentkezés látható.
A HttpClient IDisposable megvalósítása során a using utasításban történő deklarálása és instanciálása nem előnyös művelet, mertAmikor egy HttpClient objektumot szabadítunk, az alapul szolgáló socket nemazonnalkienged, ami a foglalat kimerülési problémáit okozhatja.
A probléma valójában nem maga a HttpClient, hanem a HttpClient alapértelmezett konstruktorja, mivel egy új valódi HttpMessageHandler példányt hoz létre a fent említett "socket kimerülésével" és DNS-változási problémákkal.
HttpClient közvetlen létrehozása (helytelen használat)
Közvetlenül instantizáljuk a HttpClient objektumot, és add hozzá a használatot a Dispose metódus hívásának garantálásához, a kód a következő:
Hívd az interfészt ötször, küldj HTTP kérést a HttpClient-en, és ellenőrizd a hálózati kapcsolatot a következő parancssal:
Látható, hogy amikor a HttpClient elérhetővé válik, a helyi számítógép és a célszerver közötti kapcsolatTIME_WAITMagas egyidejű esetén a hibát a következőképpen jelentik:
Nem tudok csatlakozni a távoli szerverhez
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Kérdéseihez fordulhat a következő oldalakhoz is:
Létrehozz egy HttpClinet-et az IHttpClientFactory-val (helyes használat)
DI függőségi injekció használatával az IHttpClientFactory ugyanaz, mint a HttpLinet, amelyet az IHttpClientFactory segítségével hoznak létre.
Ha hozzáadjuk a szolgáltatást az Startup fájlba, a kód a következő:
A HomeController vezérlőkód a következő:
A HttpClinet-et arra is használjuk, hogy 5 kérést küldjünk a hívási interfészen keresztül, és a gép csak kapcsolatot teremt a célszerverrel, és a kapcsolatot a kérés során újra felhasználják. Ahogy az alábbiakban látható:
Az IHttpClientFactory gyárilag létrehozott HttpMessageHandler példányokat egy poolba gyűjt az erőforrás-fogyasztás csökkentése érdekében. Amikor új HttpClient példányt hozol létre, újrahasználhatod a HttpMessageHandler példányt a poolban, ha az élettartam nem járt le.
{ "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } Az IHttpClientFactory alapértelmezés szerint DefaultHttpClientFactory néven van megvalósítva, a forráskód címmel:A hiperlink bejelentkezés látható.
Az IHttpClientFactory használatával egy DI-kompatibilis alkalmazásban elkerülheti:
- Oldd meg az erőforrás-kimerülés problémáját a HttpMessageHandler példány megosztásával.
- Oldd meg a DNS elavultságát azzal, hogy időszakosan körbefutsz a HttpMessageHandler példányokon.
Ezen felül más megoldások is vannak a fent említett problémák megoldására hosszú élettartamú SocketsHttpHandler példányok használatával.
- Hozz létre egy példányt a SocketsHttpHandler-ből az alkalmazás indításkor, és használd azt az alkalmazás életciklusa alatt.
- Állítsd be a PooledConnectionLifetime-t a DNS frissítési ideje alapján megfelelő értékre.
- Hozz létre egy HttpClient példányt az új HttpClient(handler, disposeHandler: false) segítségével, ahogy szükséges.
A fenti megközelítés hasonló módon oldja meg az erőforrás-kezelési problémákat, mint az IHttpClientFactory.
- SocketsHttpHandler a HttpClient példányok közöttMegosztott kapcsolatok。 Ez a megosztás megakadályozza a foglalat kimerülését.
- A SocketsHttpHandler a PooledConnectionLifetime alapján körforgatja a kapcsolatokat, hogy elkerülje a DNS durulását.
További használatért és konfigurációért kérjük, lásd meg:
A hiperlink bejelentkezés látható.
A hiperlink bejelentkezés látható.
|