我正在调用外部API,并且想处理调用返回Unauthorized
HttpResponseMessage
的事件。发生这种情况时,我想刷新访问 token 并再次拨打电话。
我正在尝试将Polly
与以下代码结合使用:
public async Task<HttpResponseMessage> MakeGetRequestAsync()
{
var retryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.Retry(1, (exception, retryCount) =>
{
RefreshAccessToken();
});
var result = await retryPolicy.ExecuteAsync(() => CallApiAsync());
return result;
}
private async Task<HttpResponseMessage> CallApiAsync()
{
var url = Options.ResourceSandboxUrl;
var httpClient = new HttpClient();
SetRequestHeaders(httpClient);
var response = await httpClient.GetAsync(url);
response.StatusCode = HttpStatusCode.Unauthorized;
return response;
}
我不明白为什么不调用
DoSomethingAsync
-有人可以帮我实现我的目标吗?我看了关于Stack Overflow的Polly文档和Polly问题,但是我不知道发生了什么。
最佳答案
要使用ExecuteAsync()
,必须将策略声明为.RetryAsync(...)
,而不是.Retry(...)
。
如果您的实际代码与上述代码示例完全相同,则.ExecuteAsync(...)
将抛出.Retry(...)
[一种同步策略]和.ExecuteAsync(...)
[一种异步执行]之间的不匹配。由于引发了此异常,因此实际上从不调用CallApiAsync()
。调用MakeGetRequestAsync()
时,您应该能够看到抛出的异常
总体代码方法看起来不错:此重试-刷新-身份验证是proven pattern with Polly!
关于c# - 使用Polly在HttpStatusCode之后重试。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41910066/