使用Polly和Typed Client刷新令牌

时间:2019-07-10 17:52:51

标签: asp.net-core polly

我有一个已在服务中配置的Typed Client,并且我正在使用Polly进行临时故障的重试。

目标:我想利用Polly实现刷新令牌,只要目标站点收到401响应,我都希望Polly刷新令牌并再次继续初始请求。

问题是类型客户端具有所有api方法和刷新令牌方法,当从类型客户端发起请求时,如何再次访问类型客户端以调用刷新令牌并继续初始请求?

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 :(得分:0)

您可以使用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.
            });
        });
    });