Veidojot lietojumprogrammu ar ASP.NET, HTTP pieprasījuma veikšanai tiek izmantota HttpClient klases instance. HttpClient izmantošana var šķist vienkārša. Tomēr dažas iespējamās problēmas netiek pamanītas, kamēr lietojumprogramma nav pakļauta lielai slodzei.
Problēmas, kas saistītas ar sākotnējo HttpClient klasi, kas nodrošināta .NET:Hipersaites pieteikšanās ir redzama.
HttpClient, ieviešot IDisposable, tā deklarēšana un instancēšana lietošanas paziņojumā nav vēlama darbība, joIzlaižot HttpClient objektu, pamatā esošā ligzda navUzreizatbrīvot, kas var izraisīt kontaktligzdas izsīkuma problēmas.
Problēma nav īsti pats HttpClient, bet gan HttpClient noklusējuma konstruktors, jo tas izveido jaunu faktisko HttpMessageHandler instanci ar iepriekš minētajām "ligzdas izsmelšanas" un DNS izmaiņu problēmām.
Tieši HttpClient izveide (nepareiza lietošana)
Tieši instancējiet HttpClient objektu un pievienojiet, lai garantētu izsaukumu uz Dispose metodi, kods ir šāds:
Zvaniet uz interfeisu 5 reizes, nosūtiet HTTP pieprasījumu, izmantojot HttpClient, un pārbaudiet tīkla savienojumu ar šādu komandu:
Jūs varat redzēt, ka, izlaižot HttpClient, savienojums starp vietējo datoru un mērķa serveri irTIME_WAITAugstas vienlaicīguma gadījumā kļūda tiks ziņota šādi:
Nevar izveidot savienojumu ar attālo serveri
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Jautājumu gadījumā varat arī skatīties:
Izveidojiet HttpClinet ar IHttpClientFactory (pareiza lietošana)
DI atkarības injekcijas izmantošana IHttpClientFactory ir tāda pati kā HttpLinet, kas izveidota, izmantojot IHttpClientFactory.
Pievienojiet pakalpojumu startēšanas failam, kods ir šāds:
HomeController kontrollera kods ir šāds:
Mēs arī izmantojam HttpClinet, lai nosūtītu 5 pieprasījumus, izmantojot zvana saskarni, un mašīna tikai izveido savienojumu ar mērķa serveri, un savienojums tiek atkārtoti izmantots pieprasījuma procesa laikā. Kā parādīts zemāk:
IHttpClientFactory apvieno rūpnīcā izveidotās HttpMessageHandler instances pūlā, lai samazinātu resursu patēriņu. Izveidojot jaunu HttpClient instanci, varat atkārtoti izmantot HttpMessageHandler instanci pūlā, ja tās kalpošanas laiks nav beidzies.
{ "Mūžs": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Mūžs": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory pēc noklusējuma tiek īstenots kā DefaultHttpClientFactory ar avota koda adresi:Hipersaites pieteikšanās ir redzama.
Izmantojot IHttpClientFactory DI iespējotā lietojumprogrammā, varat izvairīties:
- Atrisināt resursu izsmelšanas problēmu, koplietojot HttpMessageHandler instanci.
- Novērsiet DNS novecošanos, periodiski pārvietojot HttpMessageHandler instances.
Turklāt ir arī citi veidi, kā atrisināt iepriekš minētās problēmas, izmantojot ilgmūžīgas SocketsHttpHandler instances.
- Izveidojiet SocketsHttpHandler instanci programmas startēšanas laikā un izmantojiet to visā programmas dzīves ciklā.
- Konfigurējiet PooledConnectionLifetime uz atbilstošo vērtību, pamatojoties uz DNS atsvaidzināšanas laiku.
- Izveidojiet HttpClient instanci, izmantojot jaunu HttpClient(handler, disposeHandler: false) pēc nepieciešamības.
Iepriekš minētā pieeja atrisina resursu pārvaldības problēmas līdzīgi kā IHttpClientFactory.
- SocketsHttpHandler starp HttpClient instancēmKoplietojamie savienojumi。 Šī koplietošana novērš kontaktligzdas izsīkumu.
- SocketsHttpHandler cilpas savienojumus, pamatojoties uz PooledConnectionLifetime, lai izvairītos no DNS novecošanās.
Lai uzzinātu vairāk par lietojumu un konfigurāciju, lūdzu, skatiet:
Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama.
|