#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
?