如何在Polly中创建一个策略来支持http响应在标头后重试



我正在尝试创建一个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}");
});

最新更新