.Net Core HttpClientFactory per più servizi API

Sep 10 2020

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.

  1. Se creo 4 client denominati diversi per ogni servizio API, non creerei 4 istanze di HttpClient quando chiamo il metodo .CreateClient ()?
  2. .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

2 scharnyw Sep 10 2020 at 14:01

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.