Как использовать перенос политики на RetryPolicy<HttpResponseMessage>?

У меня есть следующая политика повтора, которая использует Polly.Extensions.Http:

var retryPolicy = Policy.Handle<BrokenCircuitException>().OrTransientHttpError().WaitAndRetryAsync
                (
                    retryCount: maxRetryCount,
                    sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
                    onRetryAsync: (exception, calculatedWaitDuration, retryCount, context) =>
                    {
                      //Code
                    }
                );

Я хочу обернуть политику политиками автоматического выключателя и перегрузки:

var circuitBreaker = Policy.Handle<HttpRequestException>().CircuitBreakerAsync(
            exceptionsAllowedBeforeBreaking: maxExceptionsBeforeBreaking,
            durationOfBreak: TimeSpan.FromSeconds(circuitBreakDurationSeconds),
            onBreak: (exception, timespan, context) =>
            {
              //Code
            },
            onReset: (context) =>
            {
                //Code
            }
        );

var sharedBulkhead = Policy.BulkheadAsync(
            maxParallelization: maxParallelizations,
            maxQueuingActions: maxQueuingActions,
            onBulkheadRejectedAsync: (context) =>
            {
                //Code
            }
        );

Я использую следующий код для объединения политик:

Policy.WrapAsync(retryPolicy, circuitBreaker, sharedBulkhead);

Это дает ошибку: cannot convert from 'Polly.Retry.RetryPolicy<System.Net.Http.HttpResponseMessage>' to 'Polly.IAsyncPolicy'

1 ответ

Решение

Когда конфигурация политики использует .HandleTransientHttpError() или же.OrTransientHttpError()политики настроены для обработки определенных результатов кода состояния при возврате выполнения HttpResponseMessage,

Это делает возвращенные политики типа, который выполняет универсальный интерфейс IAsyncPolicy<HttpResponseMessage> а не неуниверсальный IAsyncPolicy,

Создать общий PolicyWrap<TResult> используя статический синтаксис PolicyWrap, вы должны явно указать параметр универсального типа:

Policy.WrapAsync<HttpResponseMessage>(retryPolicy, circuitBreaker, sharedBulkhead)

Если вы используете синтаксис экземпляра PolicyWrap, компилятор обычно может определить синтаксис. Таким образом, следующего также должно быть достаточно:

retryPolicy.WrapAsync(circuitBreaker).WrapAsync(sharedBulkhead)

Документация Polly охватывает различия между неуниверсальными и универсальными политиками, как правило, в readme и вики.

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