Беручи до уваги, що .net HttpClient був розроблений з урахуванням повторного використання і призначений для довгого життя, а про витоки пам'яті повідомлялося в короткочасних випадках. Які напрямні лінії існують, де ви хочете робити спокійні дзвінки до даної кінцевої точки, використовуючи різні маркери носія (або будь-який заголовок авторизації) під час виклику кінцевої точки для кількох користувачів?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Враховуючи наведений вище код, який може бути викликаний будь-якою кількістю потоків у веб-програмі, цілком можливо, що заголовок, встановлений у першому рядку, не той, який використовується під час виклику ресурсу.
Який рекомендований підхід до створення та розпорядження HttpClients для однієї кінцевої точки не викликає суперечок із використанням блокувань та підтримання веб-додатків без громадянства (моя поточна практика полягає у створенні одного клієнта для кінцевої точки)?
Життєвий цикл
Незважаючи на те, що HttpClient побічно реалізує інтерфейс IDisposable, рекомендоване використання HttpClient не полягає в утилізації ним після кожного запиту. Об'єкт HttpClient призначений для життя стільки часу, скільки вашій програмі потрібно робити HTTP-запити. Наявність об’єкта в декількох запитах дозволяє місце для встановлення DefaultRequestHeaders і запобігає необхідності дотримуватись таких речей, як CredentialCache та CookieContainer, на кожному запиті, як це було потрібно з HttpWebRequest.