просто еще один вопрос о правильном использовании HttpClient
, потому что, если я что-то упустил, я нахожу противоречивую информацию о HttpClient
в Microsoft Docs. Эти две ссылки являются источником моей путаницы:
- https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how -на устранение проблемы
- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#typed -клиентов
Первый заявляет, что наилучшим подходом является общий одноэлементный HttpClient
экземпляр, второй - AddHttpClient<TypedClient>()
регистрирует службу как переходную и, более конкретно (копируется из этого URL) :
Типизированный клиент зарегистрирован как временный с DI. В предыдущем коде AddHttpClient
регистрирует GitHubService
в качестве временной службы. Эта регистрация использует фабричный метод, чтобы:
- Создать экземпляр
HttpClient
. - Создайте экземпляр
GitHubService
, передав в экземпляр HttpClient
его конструктору.
Я всегда использовал AddHttpClient<TypedClient>()
и чувствовал себя в безопасности, но теперь я снова озадачен ... И что еще хуже, я нашел комментарий к выпуску github от @rynowak, в котором говорится:
Если вы создаете библиотеку, которую планируете распространяю, я настоятельно рекомендую вам вообще не зависеть от IHttpClientFactory
, и ваши потребители передают экземпляр HttpClient
.
Почему это важно для меня? Потому что я нахожусь в процессе создания библиотеки, которая в основном делает две вещи:
- Получение токена доступа из службы токенов (
IdentityServer4
) - Использование этого токена для доступа защищенный ресурс
И я следую подходу типизированных клиентов, описанному в ссылке 2 выше:
//from https://github.com/georgekosmidis/IdentityServer4.Contrib.HttpClientService/blob/master/src/IdentityServer4.Contrib.HttpClientService/Extensions/ServiceCollectionExtensions.cs
services.AddHttpClient<IIdentityServerHttpClient, IdentityServerHttpClient>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5));
Любые советы или примеры того, как конкретный реализация на основе HttpClient
выглядит так, будет очень кстати.
Спасибо!