HttpClient
è stato progettato per essere riutilizzato per più chiamate . Anche su più thread. Il HttpClientHandler
dispone di credenziali e cookie che sono destinati ad essere riutilizzati tra le chiamate. Avere una nuova HttpClient
istanza richiede di reimpostare tutta quella roba. Inoltre, la DefaultRequestHeaders
proprietà contiene proprietà destinate a più chiamate. Dover reimpostare quei valori su ogni richiesta sconfigge il punto.
Un altro grande vantaggio di HttpClient
è la possibilità di aggiungere HttpMessageHandlers
nella pipeline richiesta / risposta per applicare preoccupazioni trasversali. Questi potrebbero essere per la registrazione, il controllo, la limitazione, la gestione dei reindirizzamenti, la gestione offline, l'acquisizione di metriche. Ogni sorta di cose diverse. Se viene creato un nuovo HttpClient su ogni richiesta, tutti questi gestori di messaggi devono essere configurati su ogni richiesta e in qualche modo deve essere fornito anche qualsiasi stato a livello di applicazione condiviso tra le richieste per questi gestori.
Più usi le funzionalità HttpClient
, più vedrai che riutilizzare un'istanza esistente ha senso.
Tuttavia, il problema più grande, a mio avviso, è che quando una HttpClient
classe viene eliminata, viene eliminata HttpClientHandler
, il che quindi chiude forzatamente la TCP/IP
connessione nel pool di connessioni gestite da ServicePointManager
. Ciò significa che ogni richiesta con una nuova HttpClient
richiede di ristabilire una nuova TCP/IP
connessione.
Dai miei test, utilizzando il semplice HTTP su una LAN, l'hit di prestazioni è abbastanza trascurabile. Sospetto che ciò sia dovuto al fatto che esiste un keepalive TCP sottostante che mantiene aperta la connessione anche quando HttpClientHandler
tenta di chiuderla.
Su richieste che vanno su Internet, ho visto una storia diversa. Ho riscontrato un aumento delle prestazioni del 40% a causa della necessità di riaprire la richiesta ogni volta.
Sospetto che l'hit su una HTTPS
connessione sarebbe ancora peggio.
Il mio consiglio è di conservare un'istanza di HttpClient per tutta la durata della tua applicazione per ogni distinta API a cui ti connetti.
Stopwatch
classe per confrontarla, comunque. La mia stima sarebbe che ha più senso avere un singoloHttpClient
, supponendo che tutte quelle istanze siano usate nello stesso contesto.