【发布时间】: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 调用?
【问题讨论】: