Când construiești o aplicație cu ASP.NET, o instanță a clasei HttpClient este folosită pentru a face o cerere HTTP. Folosirea HttpClient poate părea simplă. Totuși, unele probleme potențiale nu sunt observate până când aplicația este sub o încărcare mare.
Probleme legate de clasa originală HttpClient oferită în .NET:Autentificarea cu hyperlink este vizibilă.
HttpClient, în timp ce implementează IDisposable, declararea și instanțierea acestuia în instrucțiunea using nu este o operațiune preferată, deoareceCând se eliberează un obiect HttpClient, socket-ul de bază nu o faceinstantaneuelibera, ceea ce poate cauza probleme de epuizare a soclului.
Problema nu este neapărat HttpClient în sine, ci constructorul implicit al HttpClient, deoarece creează o nouă instanță reală HttpMessageHandler cu problemele de "epuizare a socketului" și schimbarea DNS menționate mai sus.
Crearea directă a Clientului Http (utilizare incorectă)
Instanțiază direct obiectul HttpClient și adaugă folosind pentru a garanta apelul către metoda Dispose, codul este următorul:
Sunați interfața de 5 ori, trimiteți o cerere HTTP folosind HttpClient și verificați conexiunea de rețea cu următoarea comandă:
Poți vedea că atunci când HttpClient-ul este eliberat, conexiunea dintre calculatorul local și serverul țintă esteTIME_WAITÎn cazul concurenței mari, eroarea va fi raportată astfel:
Imposibil de conectat la serverul de la distanță
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Pentru întrebări, puteți face referire și la:
Creează un HttpClinet cu IHttpClientFactory (utilizare corectă)
Folosind injectarea de dependență DI, IHttpClientFactory este același lucru cu HttpLinet, care este creat folosind IHttpClientFactory.
Adaugă serviciul în fișierul de pornire, codul este următorul:
Codul controlerului HomeController este următorul:
De asemenea, folosim HttpClinet pentru a trimite 5 cereri prin interfața apelului, iar mașina stabilește o conexiune doar cu serverul țintă, iar conexiunea este reutilizată în timpul procesului de solicitare. Așa cum se arată mai jos:
IHttpClientFactory grupează instanțele HttpMessageHandler create în fabrică într-un pool pentru a reduce consumul de resurse. Când creezi o nouă instanță HttpClient, poți reutiliza instanța HttpMessageHandler din pool dacă durata de viață nu a expirat.
{ "Pe viață": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Pe viață": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory este implementat implicit ca DefaultHttpClientFactory, cu adresa codului sursă:Autentificarea cu hyperlink este vizibilă.
Folosind IHttpClientFactory într-o aplicație compatibilă cu DI, poți evita:
- Rezolvă problema epuizării resurselor prin partajarea instanței HttpMessageHandler.
- Rezolvă blocajul DNS prin buclă periodică prin instanțele HttpMessageHandler.
În plus, există și alte modalități de a rezolva problemele de mai sus folosind instanțe SocketsHttpHandler cu durată lungă de viață.
- Creează o instanță de SocketsHttpHandler la pornirea aplicației și folosește-o pe tot parcursul ciclului de viață al aplicației.
- Configurează PooledConnectionLifetime la valoarea corespunzătoare pe baza timpului de reîmprospătare DNS.
- Creează o instanță de HttpClient folosind noul HttpClient (handler, disposeHandler: false) după necesitate.
Abordarea de mai sus rezolvă problemele de gestionare a resurselor într-un mod similar cu IHttpClientFactory.
- SocketsHttpHandler între instanțele HttpClientConexiuni comune。 Această partajare previne epuizarea socket-ului.
- SocketsHttpHandler buclă conexiunile pe baza PooledConnectionLifetime pentru a evita stagnarea DNS.
Pentru utilizare și configurare suplimentară, vă rugăm să consultați:
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
|