Обновить токен с помощью Polly с Typed Client - PullRequest
0 голосов
/ 10 июля 2019

У меня есть типизированный клиент, который я настроил в службах, и я использую Полли, чтобы повторить попытки для временных сбоев.

Цель: я хочу использовать Polly для реализации токена обновления, всякий раз, когда от целевого сайта есть ответ 401, я хочу, чтобы Polly обновил токен и продолжил первоначальный запрос снова.

Проблема в том, что типизированный клиент имеет все методы api и метод токена обновления, когда запрос инициируется из типизированного клиента, как мне снова получить доступ к типизированному клиенту, чтобы вызвать токен обновления и продолжить первоначальный запрос?

Context в onRetry обеспечивает некоторую поддержку для добавления любого объекта в словарь, но я не могу получить доступ к методу SetPolicyExecutionContext ('someContext'), и я не хочу добавлять это во все методы перед началом вызова как есть много API.

// In Service Configuration

// Refresh token policy

var refreshTokenPolicy = Polly.Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(1, (response, retrycount, context)) =>
{
    if(response.Result.StatusCode == HttpStatusCode.Unauthorized)
    {
         // Perform refresh token
    }
}

// Typed Client 
services.AddHttpClient<TypedClient>();

public class TypedClient
{
    private static HttpClient _client;
    public TypedClient(HttpClient client)
    {
        _client = client;
    }

    public string ActualCall()
    {
        // some action
    }

    public string RefreshToken()
    {
        // Refresh the token and return
    }
}

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете использовать AddPolicyHandler с перегрузкой, которая передает IServiceProvider.Так что все, что вам нужно сделать, это что-то вроде:

services.AddHttpClient<TypedClient>()
    .AddPolicyHandler((provider, request) =>
    {
        return Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
            .RetryAsync(1, (response, retryCount, context) =>
            {
                var client = provider.GetRequiredService<TypedClient>();
                // refresh auth token.
            });
        });
    });
...