HttpClient, кажется, трудно использовать его правильно - PullRequest
0 голосов
/ 04 марта 2020

просто еще один вопрос о правильном использовании HttpClient, потому что, если я что-то упустил, я нахожу противоречивую информацию о HttpClient в Microsoft Docs. Эти две ссылки являются источником моей путаницы:

  1. https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how -на устранение проблемы
  2. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#typed -клиентов

Первый заявляет, что наилучшим подходом является общий одноэлементный HttpClient экземпляр, второй - AddHttpClient<TypedClient>() регистрирует службу как переходную и, более конкретно (копируется из этого URL) :

Типизированный клиент зарегистрирован как временный с DI. В предыдущем коде AddHttpClient регистрирует GitHubService в качестве временной службы. Эта регистрация использует фабричный метод, чтобы:

  1. Создать экземпляр HttpClient.
  2. Создайте экземпляр GitHubService, передав в экземпляр HttpClient его конструктору.

Я всегда использовал AddHttpClient<TypedClient>() и чувствовал себя в безопасности, но теперь я снова озадачен ... И что еще хуже, я нашел комментарий к выпуску github от @rynowak, в котором говорится:

Если вы создаете библиотеку, которую планируете распространяю, я настоятельно рекомендую вам вообще не зависеть от IHttpClientFactory, и ваши потребители передают экземпляр HttpClient.

Почему это важно для меня? Потому что я нахожусь в процессе создания библиотеки, которая в основном делает две вещи:

  1. Получение токена доступа из службы токенов (IdentityServer4)
  2. Использование этого токена для доступа защищенный ресурс

И я следую подходу типизированных клиентов, описанному в ссылке 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 выглядит так, будет очень кстати.

Спасибо!

...