.Net Core HttpClientFactory per più servizi API
Ho un progetto .Net Core che deve connettersi a circa 4 diversi servizi API, non sono esperto con nessuno dei codici HttpClient, ma da quello che ho scoperto, è che generalmente si desidera riutilizzare solo un'istanza del tuo HttpClient. Da quello che posso dire, il consenso generale è quello di utilizzare HttpClientFactory in .Net Core registrandolo nella tua classe di avvio e quindi richiedendolo utilizzando DI.
Ora la maggior parte delle mie intestazioni predefinite e simili sono generalmente tutte uguali a parte l'URL BaseAddress, come dovrei fare quando mi connetto a 4 servizi API diff? Devo registrare 4 diversi client denominati o avere un client con tutte le informazioni predefinite preimpostate e quindi configurarlo manualmente come necessario, ad esempio configurando l'indirizzo?
Le domande generali sarebbero poiché sono abbastanza nuovo a questo, è stato detto di riutilizzare un'istanza di un HttpClient.
- Se creo 4 client denominati diversi per ogni servizio API, non creerei 4 istanze di HttpClient quando chiamo il metodo .CreateClient ()?
- .CreateClient () crea una nuova istanza ogni volta che viene chiamato, questo non vanifica lo scopo di avere un'istanza di HttpClient se diciamo che devo effettuare 3 chiamate diverse a un servizio API, ognuna di quelle chiamate chiamerà un file. CreateClient () per stabilire una sorta di connessione e questo creerà 3 istanze di HttpClient?
Qualsiasi aiuto per la chiarezza sarebbe apprezzato,
Grazie!
Risposte
Lo scopo dell'utilizzo IHttpClientFactorynon è riutilizzare le istanze di HttpClient. Invece, è riutilizzare (raggruppando) istanze di HttpMessageHandler(in realtà HttpClientHandler, che è derivato dall'abstract HttpMessageHandler) che è l'oggetto sottostante che gestisce le connessioni ei socket HTTP. Questo diagramma di Microsoft Docs lo mostra bene.
Eri preoccupato che chiamate frequenti a IHttpClientFactory.CreateClient()creeranno lo stesso problema delle chiamate frequenti a new HttpClient(). Tuttavia, questo non è il caso. Come spiegato da Microsoft docs , il motivo per cui le chiamate frequenti a new HttpClient()comporteranno l'esaurimento del socket è che questo costruttore creerà una nuova istanza di HttpMessageHandler:
Tuttavia, il problema non è realmente con HttpClient di per sé, ma con il costruttore predefinito per HttpClient, perché crea una nuova istanza concreta di HttpMessageHandler, che è quella che presenta problemi di esaurimento dei socket e modifiche DNS menzionati sopra.
Si può vedere dal codice sorgente di IHttpClientFactoryche non usa il costruttore senza parametri di HttpClienta CreateClient(). Invece, ottiene il HttpMessageHandlerda un pool e lo inietta nel creato HttpClient.
Sia che tu stia utilizzando client digitati o denominati, dovresti usare l'istanza HttpClient come se fosse un oggetto transitorio: è economico da creare e non è necessario memorizzarlo nella cache per lunghi periodi di tempo.