Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 9666|Risposta: 7

[Fonte] ASP.NET Core (XV) utilizza HttpClient per inviare richieste HTTP

[Copiato link]
Pubblicato su 14/05/2022 19:37:21 | | | |
Quando si costruisce un'applicazione con ASP.NET, si utilizza un'istanza della classe HttpClient per effettuare una richiesta HTTP. Usare HttpClient può sembrare semplice. Tuttavia, alcuni potenziali problemi non vengono notati fino a quando l'applicazione è sotto forte carico.

Problemi relativi alla classe HttpClient originale fornita in .NET:Il login del link ipertestuale è visibile.

HttpClient, pur implementando IDisposable, dichiararlo e istanziarlo nell'istruzione using non è un'operazione preferita, perchéQuando si rilascia un oggetto HttpClient, il socket sottostante non lo faimmediatamenterilascio, che può causare problemi di esaurimento della cava.

Il problema non è davvero HttpClient in sé, ma il costruttore predefinito di HttpClient, poiché crea una nuova istanza reale di HttpMessageHandler con i problemi di "socket exhaustion" e di modifica DNS menzionati sopra.



Creazione diretta di HttpClient (uso errato)

Istanzia direttamente l'oggetto HttpClient e aggiungi usando per garantire la chiamata al metodo Dispose, il codice è il seguente:

Chiama l'interfaccia 5 volte, invia una richiesta HTTP usando HttpClient e verifica la connessione di rete con il seguente comando:

Puoi vedere che quando viene rilasciato l'HttpClient, la connessione tra il computer locale e il server di destinazione èTIME_WAITNel caso di alta concorrenza, l'errore sarà riportato come segue:

Impossibile connettersi al server remoto
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Per domande, puoi anche fare riferimento a:

Usare HttpClinet in modo errato può danneggiare il tuo software
https://www.itsvse.com/thread-10310-1-1.html
Creare un HttpClinet con IHttpClientFactory (uso corretto)

Utilizzando l'iniezione di dipendenza DI, IHttpClientFactory è lo stesso di HttpLinet, che viene creato tramite IHttpClientFactory.

Aggiungi il servizio al file di avvio, il codice è il seguente:

Il codice del controller HomeController è il seguente:

Usiamo anche HttpClinet per inviare 5 richieste attraverso l'interfaccia chiamata, e la macchina stabilisce una connessione solo con il server target, e la connessione viene riutilizzata durante il processo di richiesta. Come mostrato di seguito:



IHttpClientFactory raggruppa istanze HttpMessageHandler create in fabbrica in un pool per ridurre il consumo di risorse. Quando crei una nuova istanza HttpClient, puoi riutilizzare l'istanza HttpMessageHandler nel pool se la durata non è scaduta.

{
    "Vita": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Vita": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory è implementato di default come DefaultHttpClientFactory, con l'indirizzo del codice sorgente:Il login del link ipertestuale è visibile.

Utilizzando IHttpClientFactory in un'applicazione abilitata DI, puoi evitare:

  • Risolvere il problema dell'esaurimento delle risorse condividendo l'istanza HttpMessageHandler.
  • Risolvi la stagnazione DNS passando periodicamente in loop le istanze di HttpMessageHandler.


Inoltre, esistono altri modi per risolvere i problemi sopra menzionati utilizzando istanze SocketsHttpHandler a lunga durata.

  • Crea un'istanza di SocketsHttpHandler all'avvio dell'app e usala durante tutto il ciclo di vita dell'app.
  • Configura PooledConnectionLifetime al valore appropriato in base al tempo di aggiornamento DNS.
  • Crea un'istanza di HttpClient usando il nuovo HttpClient (handler, disposeHandler: false) secondo necessità.


L'approccio sopra risolve i problemi di gestione delle risorse in modo simile a IHttpClientFactory.

  • SocketsHttpHandler tra le istanze HttpClientConnessioni condivise。 Questa condivisione previene l'esaurimento delle porte.
  • SocketsHttpHandler fa looping alle connessioni basate su PooledConnectionLifetime per evitare che il DNS non venga obsoleto.


Per ulteriori utilizzi e configurazioni, si prega di consultare a:

Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.





Precedente:Usare HttpClient in modo errato può danneggiare il tuo software
Prossimo:plugin di internazionalizzazione jQuery Datatables
 Padrone di casa| Pubblicato su 14/05/2022 19:38:14 |
recensione

ASP.NET Core (quattordici) si basa sul captcha dell'immagine SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII) per determinare se si tratta di una richiesta Ajax o meno
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (dodici) front-end JS, bundle CSS e compressione
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET percorso endpoint Core (XI) aggiunge middleware per visualizzare tutti i servizi DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Spiegazione dettagliata delle priorità di configurazione in Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Spiegazione dettagliata del middleware Middleware di Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Spiegazione dettagliata del Middleware Core
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET fosso dei parametri predefiniti dell'interfaccia di Swagger in Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core (7) Analisi approfondita del codice sorgente del framework
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI ottiene manualmente il metodo di iniezione degli oggetti
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (cinque) si basa sulle transazioni distribuite CAP
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Filtro Core(4) validazione unificata del modello ModelState
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Creare dinamicamente istanze usando ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Riavvia l'applicazione tramite codice
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) utilizza la cache Redis
https://www.itsvse.com/thread-9393-1-1.html
 Padrone di casa| Pubblicato su 14/05/2022 19:41:13 |
Pubblicato su 14/05/2022 22:36:06 |
Imparalo
Pubblicato su 19/05/2022 09:45:12 |
Eccolo che arriva, dai un'occhiata al seguito
Pubblicato su 18/08/2022 16:13:45 |
Un apprendimento fantastico
 Padrone di casa| Pubblicato su 24/06/2023 13:07:32 |
.NET/C# HttpAnalisi del codice sorgente Client
https://www.itsvse.com/thread-10617-1-1.html
 Padrone di casa| Pubblicato su 05/09/2024 14:35:55 |
Dai un'occhiata al codice sorgente di HttpClientFactoryServiceCollectionExtensions

L'implementazione predefinita di IHttpClientFactory èDefaultHttpClientFactory, come mostrato nella figura sottostante:



Il metodo CreateClient in DefaultHttpClientFactory istanzia l'oggetto HttpClientdisposeHandler: false, come mostrato nella figura sottostante:



Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com