我正在调用外部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/

10-11 05:25