我正在尝试创建一个Polly
策略来支持http response retry-after header
var retryAfterPolicy = Policy
.HandleResult<HttpResponseMessage>(r => r?.Headers?.RetryAfter != null)
.WaitAndRetryAsync(retryCount: retryAttemptsBeforeBreaking,
sleepDurationProvider: (count, response, context) => GetServerWaitDuration(response)
);
上面的代码给了我错误,
"PolicyBuilder"不包含"WaitAndRetryAsync"的定义,并且最佳扩展方法重载"RetrySyntaxAsync.WaitAndRetrySync(PolicyBuilder,int,Func("需要类型为"Policy Builder"的接收器
如何支持这一点,我还必须将其与circuitBreakerPolicy
等其他策略打包?
以下是我使用的方法
Policy
.HandleResult<HttpResponseMessage>(r =>
r.StatusCode == HttpStatusCode.TooManyRequests && r.Headers.RetryAfter != null)
.WaitAndRetryAsync(3,
sleepDurationProvider: (_, result, _) => result.Result.Headers.RetryAfter.Delta.Value,
onRetryAsync: async (_, _, _, _) => { })
如下更新您的代码,它应该可以工作
var retryAfterPolicy = Policy
.HandleResult<HttpResponseMessage>(r => r?.Headers?.RetryAfter != null)
.WaitAndRetryAsync(
3,
i => TimeSpan.FromSeconds(2),
(result, timeSpan, retryCount, context) =>
{
_logger.LogCritical($"Request failed with {result.Result.StatusCode}. Waiting {timeSpan} before next retry. Retry attempt {retryCount}");
});