我有一个像这样的政策
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
});
然后我有一个名为client的客户,看起来像这样
services.AddHttpClient("MyClient", client =>
{
client.BaseAddress = new Uri("http://some-url.com");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
client.Timeout = 30000;
})
.AddPolicyHandler(retryPolicy);
在收到401状态码时,我需要刷新HTTP客户端上的令牌。所以在完美的情况下,以下代码将完全实现我想要达到的目标。
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-to-refresh-authorization
还有其他几篇文章。然而,它们似乎都使用了 policy.ExecuteAsync()
,而我不想使用该方法,因为这样我就必须更改解决方案中的所有 HttpClient
调用。我正试图找到一种只需在 StartUp.cs 中更改代码即可为每个请求添加此功能的方法。
HttpMessageHandler
,然后用它来创建HttpClient
实例。 - ProgrammingLlama