Quando istanza di un HttpClient, quella comune pezzo di consiglio è:HttpClient Instancing Per Service-Endpoint
Tuttavia, sulla base on this link vedo commento che credo implica un'altra regola:
L'istanza di classe HttpClient agisce come una sessione di inviare richieste HTTP. Un'istanza HttpClient è una raccolta di impostazioni applicate a tutte le richieste eseguite da tale istanza. Inoltre, ogni istanza HttpClient utilizza il proprio pool di connessioni, isolando le sue richieste da richieste eseguite da altre istanze di HttpClient.
Questo mi chiede se dovrei creare un'istanza HttpClient per ogni endpoint di servizio con cui interagisco. Per "servizio-endpoint", intendo un indirizzo di base distinto. Ciascuno dei seguenti sarebbe un distinto "service-endpoint":
- "http://foo.net/api/Message/"
- "http://bar.com/api/Message/"
- "http://wow.gov/api/Message/"
- "http://now.com/api/Message/"
- "http://mom.org/api/Message/"
- "http://dog.com/api/Message/"
Certamente se intendo utilizzare la proprietà "BaseAddress" di HttpClient e se si tratta di chiamate simultanee, sarà necessario disporre di un'istanza di HttpClient per "service-endpoint".
Tuttavia, HttpClient mi permette di specificare un indirizzo assoluto esplicitamente:
HttpClient client = new HttpClient(...);
client.PostAsJsonAsync("http://foo.net/api/Message/", ...);
client.PostAsJsonAsync("http://bar.com/api/Message/", ...);
client.PostAsJsonAsync("http://wow.gov/api/Message/", ...);
client.PostAsJsonAsync("http://now.com/api/Message/", ...);
client.PostAsJsonAsync("http://mom.org/api/Message/", ...);
client.PostAsJsonAsync("http://dog.com/api/Message/", ...);
Il codice precedente funziona, ed è esattamente quello che voglio per l'applicazione corrente che sto costruendo. Ma la domanda fastidiosa rimane ... Sto facendo qualcosa di sbagliato se uso un HttpClient per tutti i service-endpoint con cui comunica la mia applicazione?
C'è una ragione per cui avrei davvero bisogno del "connection pool isolation" che è stato menzionato nella citazione sopra?
* perché sto facendo in modo che molti endpoint condividano lo stesso pool di connessioni. * Potresti espanderlo? Cosa intendi per endpoint? Come userete 'HttpClient'? Per chiamare endpoint HTTP externel? –
In base all'esperienza personale, penso che la risposta dipenda in gran parte dal tipo di concorrenza e di velocità necessaria. Ho scoperto che una singola istanza di un HttpClient si blocca dopo un po 'e più istanze _can_ help. Detto questo, con un volume sufficiente, esaurirai le risorse del server e potresti dover ridimensionare orizzontalmente. –
Ho rivisto la mia domanda per chiarire "l'endpoint del servizio" e il problema che mi riguarda. Sì, userò HttpClient per chiamare endpoint HTTP esterni. –