我正在使用Xamarin编写移动应用程序,因此我需要一个策略来重试网络请求。我的应用程序调用的API提供了一个过期的JWT,因此如果收到相关响应,我需要自动重新验证。对于波莉来说,这似乎应该是微不足道的,波莉维基甚至说这是微不足道的,但我无法让它发挥作用。
最终目标是:
这是我的代码。如果响应成功,则此操作正常。它还会根据网络故障进行重试。问题是,当收到401时,始终从策略返回该响应。调用重新认证并成功返回,但Polly在那里中断 - 原始请求不会被重试,并返回原始的401响应。
// example
var result = await RetryPolicy.ExecuteAndCaptureAsync(() => _client.SendAsync(request));
// policies
public static PolicyWrap<HttpResponseMessage> RetryPolicy
{
get => WaitAndRetryPolicy.WrapAsync(ReAuthPolicy);
}
private static IAsyncPolicy WaitAndRetryPolicy
{
get => Policy
.Handle<WebException>()
.Or<HttpRequestException>()
.WaitAndRetryAsync(4, _ => TimeSpan.FromSeconds(2));
}
private static IAsyncPolicy<HttpResponseMessage> ReAuthPolicy
{
get => Policy
.HandleResult<HttpResponseMessage>(x => x.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(retryCount: 1, onRetryAsync: (_, __) => App.CoreService.LogInWithSavedCredsAsync(true));
}
答案 0 :(得分:0)
毕竟我的代码是正确的,我只是没有在LogInWithSavedCredentials
函数中正确设置授权凭据。