Kun rakennetaan sovellusta ASP.NET:lla, HTTP-pyynnön tekemiseen käytetään HttpClient-luokan instanssia. HttpClientin käyttö saattaa tuntua yksinkertaiselta. Kuitenkin joitakin mahdollisia ongelmia ei havaita ennen kuin sovellus on raskaassa kuormituksessa.
Ongelmat, jotka liittyvät alkuperäiseen HttpClient-luokkaan .NET:ssä:Hyperlinkin kirjautuminen on näkyvissä.
HttpClient, IDisposablen toteuttamisen yhteydessä, sen julistaminen ja instanssiointi useus-lauseessa ei ole suositeltu operaatio, koskaKun HttpClient-objekti vapautetaan, taustalla oleva socket ei vapautavälittömästivapauttaa, mikä voi aiheuttaa hylsyjen uupumisongelmia.
Ongelma ei oikeastaan ole itse HttpClient, vaan HttpClientin oletuskonstruktori, sillä se luo uuden varsinaisen HttpMessageHandler-instanssin, jossa on edellä mainitut "socket exhaustion" ja DNS-muutosongelmat.
HttpClientin luominen suoraan (väärä käyttö)
Luo HttpClient-objekti suoraan ja lisää käyttö Dispose-metodin kutsun varmistamiseksi, koodi on seuraava:
Kutsu rajapintaa viisi kertaa, lähetä HTTP-pyyntö HttpClientin kautta ja tarkista verkkoyhteys seuraavalla komennolla:
Näet, että kun HttpClient vapautetaan, yhteys paikallisen tietokoneen ja kohdepalvelimen välillä onTIME_WAITKorkean samanaikaisuuden tapauksessa virhe raportoidaan seuraavasti:
Ei pysty yhdistämään etäpalvelimeen
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Kysymyksissä voit myös katsoa:
Luo HttpClinet IHttpClientFactorylla (oikea käyttö)
DI-riippuvuuden injektiolla IHttpClientFactory on sama kuin HttpLinet, joka luodaan IHttpClientFactoryllä.
Lisää palvelu Startup-tiedostoon, koodi on seuraava:
HomeController-ohjaimen koodi on seuraava:
Käytämme myös HttpClinetia lähettääksemme 5 pyyntöä puheluliittymän kautta, ja kone muodostaa yhteyden vain kohdepalvelimeen, ja yhteyttä käytetään uudelleen pyyntöprosessin aikana. Kuten alla on esitetty:
IHttpClientFactory poolaa tehtaan luomat HttpMessageHandler -instanssit pooliin resurssien kulutuksen vähentämiseksi. Kun luot uuden HttpClient-instanssin, voit käyttää HttpMessageHandler-instanssia uudelleen poolissa, jos elinikä ei ole vielä umpeutunut.
{ "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 oletuksena toteutettu nimellä DefaultHttpClientFactory, lähdekoodiosoitteella:Hyperlinkin kirjautuminen on näkyvissä.
Käyttämällä IHttpClientFactoryä DI-yhteensopivassa sovelluksessa voit välttää:
- Ratkaise resurssien loppumisen ongelma jakamalla HttpMessageHandler-instanssi.
- Ratkaise DNS:n vanhentuneisuus käymällä säännöllisesti läpi HttpMessageHandler-instansseja.
Lisäksi on olemassa muita tapoja ratkaista edellä mainitut ongelmat käyttämällä pitkäikäisiä SocketsHttpHandler-instansseja.
- Luo SocketsHttpHandler-instanssi sovelluksen käynnistyksen yhteydessä ja käytä sitä koko sovelluksen elinkaaren ajan.
- Määritä PooledConnectionLifetime oikeaan arvoon DNS-virkistysajan perusteella.
- Luo HttpClient-instanssi käyttämällä uutta HttpClient(handler, disposeHandler: false) tarpeen mukaan.
Yllä oleva lähestymistapa ratkaisee resurssienhallinnan ongelmat samalla tavalla kuin IHttpClientFactory.
- SocketsHttpHandler HttpClient-instanssien välilläJaetut yhteydet。 Tämä jakaminen estää hylsyjen ehtymisen.
- SocketsHttpHandler silmukoi yhteyksiä PooledConnectionLifetimen pohjalta DNS:n vanhentumisen välttämiseksi.
Lisäkäyttöä ja asetuksia varten katso:
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
|