Как избежать исключения ThrowAddingDuplicateWithKeyArgumentException с помощью HttpClient и задачи.Когда все

#c# #http-headers #identityserver4 #dotnet-httpclient #ihttpclientfactory

Вопрос:

Итак, я написал класс для реализации гранта на делинтеграцию IdentityServer4. Класс ожидает HttpClient IHttpContextAccessor доступа к текущему заголовку и некоторым настройкам.

 public DelegationAuthServiceClient(HttpClient httpClient, IHttpContextAccessor httpContextAccessor, IIdentityServerSettings identityServerSettings)
 

Перед вызовом суб-api я попросил его запросить новый токен с необходимыми областями действия. Если ошибки нет, он вызывает:

 _httpClient.SetBearerToken(tokenResponse.AccessToken);
 

В Startup.cs api, использующем этот класс делегирования, у меня есть:

 services.AddHttpClient<IDelegationAuthServiceClient, DelegationAuthServiceClient>();
 

Это IHttpClientFactory DelegationAuthServiceClient позволяет снабжать ан HttpClient .

Все это отлично работает, пока я не попытаюсь использовать Task.WhenAll несколько вызовов делегирования при большой нагрузке. Затем я начинаю видеть:

 ThrowAddingDuplicateWithKeyArgumentException
An item with the same key has already been added. Key: System.Net.Http.Headers.HeaderDescriptor
 

на SetBearerToken линии. Я предполагаю, что это происходит из-за того, что один вызов делегирования не завершен, в то время как другой пытается установить токен, а «Предъявитель» уже существует в заголовке.

Я читал статьи, в которых говорилось о том, почему нехорошо создавать что-то новое HttpClient при каждом звонке, а также нехорошо иметь синглтон HttpClient . Я думал IHttpClientFactory , что он был создан для того, чтобы при необходимости создавать новый. Но, похоже, это не так.

Каков был бы предложенный или правильный способ избежать этой ошибки, помимо отказа от использования Task.WhenAll ?