Rakenduse ehitamisel ASP.NET-ga kasutatakse HTTP-päringu tegemiseks HttpClient klassi eksemplari. HttpClienti kasutamine võib tunduda lihtne. Siiski märgata mõningaid võimalikke probleeme alles siis, kui rakendus on tugeva koormuse all.
Probleemid, mis on seotud algse HttpClient klassiga, mis on esitatud .NET-is:Hüperlingi sisselogimine on nähtav.
HttpClient, IDisposable'i rakendamisel, ei ole selle deklareerimine ja instantsimine using lauses eelistatud toiming, sestKui vabastatakse HttpClient objekt, siis aluseks olev pesa seda ei teeKoheseltvabastama, mis võib põhjustada pistikupesa tühjenemise probleeme.
Probleem ei ole tegelikult HttpClient ise, vaid HttpClienti vaikimisi konstruktor, kuna see loob uue tegeliku HttpMessageHandler instantsi koos eespool mainitud "socketi ammendumise" ja DNS-i muutmise probleemidega.
HttpClienti otsene loomine (vale kasutus)
Instantsi HttpClient objekt otse ja lisa kasutamine, et tagada Dispose meetodi kutse, kood on järgmine:
Kutsu liidest 5 korda, saada HTTP-päring HttpClienti kaudu ja kontrolli võrguühendust järgmise käsuga:
Näete, et kui HttpClient vabastatakse, on ühendus kohaliku arvuti ja sihtserveri vahelTIME_WAITKõrge samaaegsuse korral teatatakse viga järgmiselt:
Ei suuda kaugserveriga ühenduda
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Küsimuste korral võite pöörduda ka järgmiste kohta:
Loo HttpClinet IHttpClientFactory abil (õige kasutus)
DI sõltuvuse süstimise kasutamine on IHttpClientFactory sama mis HttpLinet, mis luuakse IHttpClientFactory abil.
Lisa teenus Startup-faili, kood on järgmine:
HomeControlleri kontrolleri kood on järgmine:
Me kasutame ka HttpClinet'i, et saata kõneliidese kaudu 5 päringut ning masin loob ühenduse ainult sihtserveriga ning ühendust kasutatakse päringuprotsessi käigus uuesti. Nagu allpool näidatud:
IHttpClientFactory koondab tehases loodud HttpMessageHandler instantsid basseini, et vähendada ressursikasutust. Kui loote uue HttpClient instantsi, võite kasutada HttpMessageHandler instantsi basseinis, kui eluiga pole veel lõppenud.
{ "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory on vaikimisi implementeeritud kui DefaultHttpClientFactory, lähtekoodi aadressiga:Hüperlingi sisselogimine on nähtav.
Kasutades IHttpClientFactory'd DI-toega rakenduses, saate vältida:
- Lahenda ressursside ammendumise probleem, jagades HttpMessageHandleri eksemplari.
- Lahenda DNS-i aegumine, läbides perioodiliselt HttpMessageHandleri instantse.
Lisaks on olemas ka teisi viise ülaltoodud probleemide lahendamiseks, kasutades pika eluiga SocketsHttpHandler instantse.
- Loo rakenduse käivitamisel SocketsHttpHandleri eksemplar ja kasuta seda kogu rakenduse elutsükli vältel.
- Seadista PooledConnectionLifetime sobivale väärtusele vastavalt DNS-i värskendusajale.
- Loo HttpClienti eksemplar, kasutades vajadusel uut HttpClient(handler, disposeHandler: false).
Ülaltoodud lähenemine lahendab ressursihalduse probleeme sarnaselt IHttpClientFactory'le.
- SocketsHttpHandler HttpClient instantside vahelJagatud ühendused。 See jagamine takistab pistikupesa ammendumist.
- SocketsHttpHandler tsüklib ühendusi PooledConnectionLifetime alusel, et vältida DNS-i seiskumist.
Lisakasutuse ja konfiguratsioonide saamiseks palun vaata:
Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.
|