У меня есть политика, которая выглядит следующим образом
var retryPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(resp => resp.StatusCode == HttpStatusCode.Unauthorized)
.WaitAndRetryAsync(3,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: (resp, timeSpan, context) =>
{
// not sure what to put here
});
Затем у меня есть именованный клиент, который выглядит следующим образом
services.AddHttpClient("MyClient", client =>
{
client.BaseAddress = new Uri("http://some-url.com");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
client.Timeout = 30000;
})
.AddPolicyHandler(retryPolicy)
Мне нужно обновить sh маркер носителя на http-клиент в случае, если я получу 401. Так что в идеальном мире следующий код будет делать именно то, что я пытаюсь сделать sh
var retryPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(resp => resp.StatusCode == HttpStatusCode.Unauthorized)
.WaitAndRetryAsync(3,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: (resp, timeSpan, context) =>
{
var newToken = GetNewToken();
//httpClient doesn't exists here so I need to grab it some how
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", newToken);
});
Я прочитал следующие статьи:
Восстановление аутентификации с помощью Retry
Refre sh Токен с использованием Polly с типизированным клиентом
retry-to -refre sh -авторизация
и еще пара других. Однако все они, похоже, используют policy.ExecuteAsyn c () , который я не хочу использовать, потому что тогда мне придется изменить все вызовы httpClient в моем решении. Я пытаюсь найти способ просто добавить эту функцию в каждый запрос, изменив код только в StartUp.cs .