使用Polly和Typed Client刷新令牌 [英] Refresh Token using Polly with Typed Client
问题描述
我有一个在服务中配置的Typed Client,并且我正在使用Polly进行临时故障的重试.
I have a Typed Client which i have configured in the services and i am using Polly to make retries for transient faults.
目标:我想利用Polly实现刷新令牌,只要目标站点收到401响应,我都希望Polly刷新令牌并再次继续初始请求.
Aim: I want to make use of Polly to implement refresh token, whenever there is a 401 response from the target site, i want Polly to refresh the token and continue the initial request again.
问题是类型客户端具有所有api方法和刷新令牌方法,当从类型客户端发起请求时,如何再次访问类型客户端以调用刷新令牌并继续初始请求?
The problem is the typed client has all the api methods and the refresh token method, when the request is initiated from the typed client how do i access the typed client again to call the refresh token and continue the initial request?
onRetry中的上下文"为将任何对象添加到字典中提供了一些支持,但是我无法访问SetPolicyExecutionContext('someContext')方法,并且我不想在发起调用之前将其添加到所有方法中因为有很多API.
The 'Context' in onRetry provides some support to add any object to the dictionary, but i am unable to access the SetPolicyExecutionContext('someContext') method and i do not want to add this on all the methods before initiating the call as there's whole lot of 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
}
}
推荐答案
您可以使用AddPolicyHandler
,它的重载可以通过IServiceProvider
.因此,您所需要做的就是:
You can useAddPolicyHandler
which has an overload that passesIServiceProvider
. So all you need to do is something like:
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.
});
});
});
这篇关于使用Polly和Typed Client刷新令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!