Kuriant programą su ASP.NET, HTTP užklausai pateikti naudojamas HttpClient klasės egzempliorius. Naudojant HttpClient gali atrodyti paprasta. Tačiau kai kurios galimos problemos nepastebimos, kol programa nėra labai apkrauta.
Problemos, susijusios su pradine HttpClient klase, pateikta .NET:Hipersaito prisijungimas matomas.
HttpClient, įgyvendinant IDisposable, deklaruoti ir instancuoti jį naudojant sakinį nėra pageidaujama operacija, nesIšleidžiant "HttpClient" objektą, pagrindinis lizdasAkimirksniuišlaisvinti, o tai gali sukelti lizdo išsekimo problemų.
Problema yra ne pats HttpClient, o numatytasis HttpClient konstruktorius, nes jis sukuria naują faktinį HttpMessageHandler egzempliorių su aukščiau minėtomis "lizdo išnaudojimo" ir DNS keitimo problemomis.
HttpClient kūrimas tiesiogiai (neteisingas naudojimas)
Tiesiogiai sukurkite "HttpClient" objektą ir pridėkite naudodami norėdami garantuoti iškvietimą į "Disponuoti" metodą, kodas yra toks:
Skambinkite sąsajai 5 kartus, išsiųskite HTTP užklausą naudodami "HttpClient" ir patikrinkite tinklo ryšį naudodami šią komandą:
Galite pamatyti, kad išleidus "HttpClient", ryšys tarp vietinio kompiuterio ir tikslinio serverio yraTIME_WAITEsant dideliam sutapimui, klaida bus pranešta taip:
Nepavyko prisijungti prie nuotolinio serverio
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Jei turite klausimų, taip pat galite kreiptis:
Sukurkite "HttpClinet" naudodami "IHttpClientFactory" (teisingas naudojimas)
Naudojant DI priklausomybės injekciją IHttpClientFactory yra tas pats, kas HttpLinet, kuris sukurtas naudojant IHttpClientFactory.
Pridėkite paslaugą prie paleisties failo, kodas yra toks:
"HomeController" valdiklio kodas yra toks:
Mes taip pat naudojame "HttpClinet", kad siųstume 5 užklausas per skambučio sąsają, o aparatas užmezga tik ryšį su tiksliniu serveriu, o ryšys pakartotinai naudojamas užklausos proceso metu. Kaip parodyta žemiau:
"IHttpClientFactory" sutelkia gamykloje sukurtus "HttpMessageHandler" egzempliorius į telkinį, kad sumažintų išteklių suvartojimą. Kurdami naują "HttpClient" egzempliorių, galite pakartotinai naudoti "HttpMessageHandler" egzempliorių telkinyje, jei jo galiojimo laikas nepasibaigęs.
{ "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 pagal numatytuosius nustatymus įdiegtas kaip DefaultHttpClientFactory, kurio šaltinio kodo adresas:Hipersaito prisijungimas matomas.
Naudodami "IHttpClientFactory" DI palaikančioje programoje galite išvengti:
- Išspręskite išteklių išeikvojimo problemą bendrindami HttpMessageHandler egzempliorių.
- Išspręskite DNS pasenimą periodiškai peržiūrėdami "HttpMessageHandler" egzempliorius.
Be to, yra ir kitų būdų, kaip išspręsti aukščiau nurodytas problemas naudojant ilgaamžius "SocketsHttpHandler" egzempliorius.
- Paleisdami programą sukurkite "SocketsHttpHandler" egzempliorių ir naudokite jį per visą programos gyvavimo ciklą.
- Sukonfigūruokite PooledConnectionLifetime į atitinkamą reikšmę pagal DNS atnaujinimo laiką.
- Sukurkite HttpClient egzempliorių naudodami naują HttpClient(handler, disposeHandler: false) pagal poreikį.
Aukščiau pateiktas metodas išsprendžia išteklių valdymo problemas panašiai kaip IHttpClientFactory.
- SocketsHttpHandler tarp HttpClient egzemplioriųBendrinami ryšiai。 Šis dalijimasis apsaugo nuo lizdo išsekimo.
- SocketsHttpHandler sujungia ryšius pagal PooledConnectionLifetime, kad būtų išvengta DNS pasenimo.
Norėdami gauti daugiau naudojimo ir konfigūracijos, žr.:
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
|