Étant donné que le HttpClient de .net a été conçu dans un souci de réutilisation et qu'il est prévu qu'il soit a vécu longtemps y des fuites de mémoire ont été signalées dans des cas de courte durée. Quelles sont les lignes directrices à suivre lorsque vous souhaitez effectuer des appels reposants vers un point de terminaison donné en utilisant différents jetons de support (ou tout en-tête d'autorisation) lorsque vous appelez le point de terminaison pour plusieurs utilisateurs ?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Étant donné que le code ci-dessus peut être appelé par un nombre quelconque de threads sur une application web, il est facilement possible que l'en-tête défini dans la première ligne ne soit pas le même que celui qui est utilisé lors de l'appel de la ressource.
Sans causer de contention en utilisant des verrous et en maintenant une application web sans état, quelle est l'approche recommandée pour créer et disposer des HttpClients pour un seul point de terminaison (ma pratique actuelle est de créer un seul client par point de terminaison) ?
Cycle de vie
Bien que HttpClient implémente indirectement l'interface IDisposable l'utilisation recommandée de HttpClient est de ne pas s'en débarrasser après chaque requête. L'objet HttpClient est conçu pour vivre aussi longtemps que aussi longtemps que votre application a besoin d'effectuer des requêtes HTTP. Le fait qu'un objet existe à travers de multiples requêtes permet de définir un endroit pour DefaultRequestHeaders et vous évite d'avoir à respécifier les choses. comme CredentialCache et CookieContainer à chaque requête, comme cela était nécessaire avec HttpWebRequest.
0 votes
Parlez-vous d'un nombre relativement faible d'en-têtes d'authentification différents ou d'un grand nombre, par exemple unique pour chaque utilisateur ?
0 votes
@ToddMenier - Il s'agirait d'un en-tête unique pour chaque utilisateur. Ce serait le jeton oauth de cet utilisateur. Je pense que scott hannen m'a mis sur la bonne voie. Il semble que certaines méthodes d'extension seront en ordre.
0 votes
Bonjour @Bronumski , pouvez-vous partager la façon dont vous avez résolu ce problème ? J'ai le même problème avec plusieurs fils qui ajoutent le même en-tête mais avec un contenu différent.
0 votes
@LuisMejia - J'ai mis à jour la réponse de Scotts avec un exemple de la façon dont j'ai effectué le GET et le POST. Le même principe est utilisé sur toutes les autres méthodes que vous voulez mettre en œuvre. La méthode d'extension inclut une action qui vous permet de manipuler le HttpRequest avant qu'il ne soit envoyé.
0 votes
@Bronumski Merci pour la réponse... il me semble que j'emprunte une voie similaire en utilisant sendasync et en passant une requête en paramètre avec les en-têtes personnalisés.