Refre sh Token с использованием Polly с именованным клиентом - PullRequest
2 голосов
/ 21 января 2020

У меня есть политика, которая выглядит следующим образом

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 .

...