【问题标题】:Polly RetryAsync not working and code is not loggedPolly RetryAsync 不工作且代码未记录
【发布时间】:2020-01-28 14:32:28
【问题描述】:

我正在尝试使用 AsyncRetryPolicy 处理所有 401 响应。

一些注意事项:

  • 我正在使用 Xamarin.Forms
  • 我正在使用 Refit 但没有 HttpClientFactory

这是重试策略:

var unauthorizedPolicy = Policy.Handle<ApiException>(ex => ex.StatusCode == HttpStatusCode.Unauthorized)
    .RetryAsync(3, async (exception, retryCount) =>
    {
        Logger.Instance.Info($"Unauthorized, token probably expired, retry count: {retryCount}");
        try
        {
            Logger.Instance.Error(exception.Message);
            Logger.Instance.Info("Retrying request and retrive refresh token");
            var token = await _authService.SignInSilentlyAsync();
            await SecureStorage.SetAsync(Constants.PreferencesNames.Token.Value, token);
        }
        catch (Exception ex)
        {
            Logger.Instance.Error(ex.Message);
            Logger.Instance.Info("SignInSilentlyAsync failed, going to login page");
            NavigationService.ReplaceRoot(new LoginPageViewModel());
        }
    });

这是在另一个类中执行的:

result = await _taskManager._defaultPolicyForHttpRequests // the above defined unauthorizedPolicy
    .ExecuteAndCaptureAsync<T>(async () => await task)
    .ConfigureAwait(false);

基本上,当令牌过期时,我会尝试并成功获取新令牌,但似乎每次尝试仍使用旧令牌:

从日志中可以看出,令牌已成功检索,但我认为重试调用时使用的是旧令牌。我不能确定,因为通话不再被记录。

这就引出了我的第二个问题,有没有办法记录调试 Polly 重试的每个 HTTP 调用?

【问题讨论】:

    标签: c# xamarin polly


    【解决方案1】:

    从日志中可以看出,令牌已成功检索,但我认为重试调用时使用的是旧令牌。我不能确定,因为通话不再被记录。

    代码只进行了一次调用:

    var task = SomeMethodNotShownAsync();
    result = await _taskManager._defaultPolicyForHttpRequests // the above defined unauthorizedPolicy
        .ExecuteAndCaptureAsync<T>(async () => await task)
        .ConfigureAwait(false);
    

    特别是,这是有问题的部分:

    ExecuteAndCaptureAsync<T>(async () => await task)
    

    await“执行任务”。它异步等待任务完成。所以async () =&gt; await task第一次被Polly执行,它会异步等待任务完成。它最终以错误完成。 async () =&gt; await task 的所有未来执行异步等待同一个任务完成 - 该任务已经完成但出现错误。

    所以当前代码让 Polly 重试“等待操作完成”。它不会重试操作本身。

    要解决此问题,请让 Polly 每次重试实际工作,而不是仅仅重试“等待操作完成”:

    result = await _taskManager._defaultPolicyForHttpRequests // the above defined unauthorizedPolicy
        .ExecuteAndCaptureAsync<T>(async () => await SomeMethodNotShownAsync())
        .ConfigureAwait(false);
    

    有没有办法记录和调试 Polly 重试的每个 HTTP 调用?

    已经是了。 :) 一个呼叫只有日志消息的原因是因为 只有一个呼叫。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多