Esplorare i client HTTP in .NET Core

Completato

Il protocollo Hypertext Transfer Protocol (o HTTP) viene usato per richiedere risorse da un server Web. Molti tipi di risorse sono disponibili sul Web e HTTP definisce un set di metodi di richiesta per l'accesso a queste risorse. In .NET Core, le richieste vengono effettuate tramite un'istanza di HttpClient.

Sono disponibili due opzioni per l'implementazione di HttpClient nell'app ed è consigliabile scegliere l'implementazione in base alle esigenze di gestione della durata dei client:

  • Per i client di lunga durata: creare un'istanza static o singleton usando la classe HttpClient e impostare PooledConnectionLifetime
  • Per i client di breve durata: usare i client creati da IHttpClientFactory

Implementare con la classe HttpClient

La classe System.Net.Http.HttpClient invia richieste HTTP e riceve risposte HTTP da una risorsa identificata da un URI. Un'istanza HttpClient è una raccolta di impostazioni applicate a tutte le richieste eseguite da tale istanza; ogni istanza usa il proprio pool di connessioni, che isola le richieste da altri utenti. A partire da .NET Core 2.1, la classe SocketsHttpHandler fornisce l'implementazione, rendendo coerente il comportamento in tutte le piattaforme.

HttpClient risolve solo le voci DNS quando viene creata una connessione. Non tiene traccia del tempo di durata (TTL) specificato dal server DNS. Se le voci DNS cambiano regolarmente, il client non sarà a conoscenza di tali aggiornamenti. Per risolvere questo problema, è possibile limitare la durata della connessione impostando la proprietà PooledConnectionLifetime, in modo che la ricerca DNS venga ripetuta quando la connessione viene sostituita.

Nell'esempio seguente,HttpClient viene configurato per riutilizzare le connessioni per 15 minuti. Dopo il TimeSpan specificato da PooledConnectionLifetime, la connessione viene chiusa e ne viene creata una nuova.

var handler = new SocketsHttpHandler
{
    PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);

Implementare con IHttpClientFactory

L'oggetto IHttpClientFactory funge da astrazione factory che può creare istanze di HttpClient con configurazioni personalizzate. IHttpClientFactory è stato introdotto in .NET Core 2.1. I carichi di lavoro .NET basati su HTTP comuni possono sfruttare facilmente il middleware.

Quando si chiama uno dei metodi di estensione AddHttpClient, vengono aggiunti i IHttpClientFactory e i servizi correlati a IServiceCollection. Il tipo IHttpClientFactory offre i vantaggi seguenti:

  • Espone la classe HttpClient come tipo pronto per l'inserimento di dipendenze.
  • Offre una posizione centrale per la denominazione e la configurazione di istanze di HttpClient logiche.
  • Codifica il concetto di middleware in uscita tramite delega dei gestori in HttpClient.
  • Fornisce metodi di estensione per il middleware basato su Polly per sfruttare i vantaggi della delega dei gestori in HttpClient.
  • Gestisce la memorizzazione nella cache e la durata delle istanze HttpClientHandler sottostanti. La gestione automatica evita problemi comuni del sistema DNS (Domain Name System) che si verificano durante la gestione manuale delle durate HttpClient.
  • Aggiunge un'esperienza di registrazione configurabile per tutte le richieste inviate attraverso i client creati dalla factory.

È consigliabile consentire a HttpClientFactory e al framework di gestire le durate e la creazione di istanze HttpClient. La gestione della durata consente di evitare problemi comuni, ad esempio problemi DNS (Domain Name System) che possono verificarsi durante la gestione manuale delle durate HttpClient.

IHttpClientFactory può essere usato in un'app in diversi modi:

L'approccio migliore dipende dai requisiti dell'app.