Pathoschild/FluentHttpClient выдает ошибку для настраиваемой координации повторных попыток с использованием Polly

Я имею в виду эту https://github.com/Pathoschild/FluentHttpClient для создания настраиваемой координации повторных попыток и пытаюсь использовать Polly здесь, но я получаю ошибку ниже,

"PolicyBuilder" не содержит определения для "Retry", а перегрузка лучшего метода расширения "RetrySyntax.Retry(PolicyBuilder, int, Action)" требует получателя типа "PolicyBuilder"

Что здесь не так?

public class PollyCoordinator : IRequestCoordinator
{
    public Task<HttpResponseMessage> ExecuteAsync(IRequest request, Func<IRequest, Task<HttpResponseMessage>> dispatcher)
    {
        int[] retryCodes = { 408, 500, 502, 503, 504 };
        return Policy
            .HandleResult<HttpResponseMessage>(r => retryCodes.Contains((int)r.StatusCode))
            .Retry(3, async () => await dispatcher(request));
    }
}

1 ответ

Я обновил пример в файле readme FluentHttpClient. Вот фиксированная версия вашего кода:

public class PollyCoordinator : IRequestCoordinator
{
    public Task<HttpResponseMessage> ExecuteAsync(IRequest request, Func<IRequest, Task<HttpResponseMessage>> send)
    {
        int[] retryCodes = { 408, 500, 502, 503, 504 };
        return Policy
            .HandleResult<HttpResponseMessage>(r => retryCodes.Contains((int)r.StatusCode)) // should we retry?
            .RetryAsync(3) // up to 3 retries
            .ExecuteAsync(() => send(request)); // begin handling request
    }
}

Если вам нужна задержка между повторными попытками (рекомендуется), вы можете заменить RetryAsync(3) с чем-то вроде WaitAndRetryAsync(3, attempt => TimeSpan.FromSeconds(attempt)).

Другие вопросы по тегам