Решение, аналогичное тому, что опубликовано @ Ruben-J, заключается в создании настраиваемого HttpMessageHandler, который назначает заголовок авторизации запросам, сделанным через HttpClient во время запроса.
Вы можете создать настраиваемый HttpMessageHandler, который может быть назначен именованному HttpClient в Startup следующим образом:
public class YourHttpMessageHandler : DelegatingHandler
{
private readonly IYourTokenProviderService _yourTokenProviderService;
public YourHttpMessageHandler(IYourTokenProviderService yourTokenProviderService)
: base()
{
_yourTokenProviderService = yourTokenProviderService;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = SendAsyncWithAuthToken(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
await _yourTokenProviderService.RefreshTokenAsync();
response = SendAsyncWithAuthToken(request, cancellationToken);
}
return response;
}
private async Task<HttpResponseMessage> SendWithAuthTokenAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _yourTokenProviderService.Token);
return await base.SendAsync(request, cancellationToken);
}
}
Затем вы настраиваете свои службы и называете HttpClient в Startup:
public virtual void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<IYourTokenProviderService, YourTokenProviderService>();
services.AddTransient<YourHttpMessageHandler>();
services.AddHttpClient<IYourNamedHttpClient, YourNamedHttpClient>()
.AddHttpMessageHandler<YourHttpMessageHandler>();
...
}
Стоит отметить, что текущая реализация Polly's AddPolicyHandler
также добавляет свой собственный DelegatingHandler. Дополнительную информацию см. В документации Microsoft по добавлению DelegatingHandler. Вот также отличная серия статей Стива Гордона .