ошибка при попытке обернуть fallbackForCircuitBreaker с помощью asyncPolicy

У меня есть IAsyncPolicy<HttpResponseMessage>, который является оболочкой двух политик timeoutPolicy и waitAndRetryPolicy, которые я возвращаю с переменной asyncPolicy.

Теперь у меня есть другая политика fallbackForCircuitBreaker, которую я хочу обернуть asyncPolicy, но это дает мне ошибку ниже,

'IAsyncPolicy ‹HttpResponseMessage>' не содержит определения для 'WrapAsync', а перегрузка лучшего метода расширения 'IAsyncPolicyPolicyWrapExtensions.WrapAsync‹ HttpResponseMessage> (IAsyncPolicy, IAsyncPolicy type' IAsyncPolicy) требует получателя типа IAsyncPolicy.

Что это значит и как решить?

static void Main(string[] args)
    {
        var asyncPolicy = CreateDefaultRetryPolicy();

        var fallbackForCircuitBreaker = Policy<bool>
                        .Handle<BrokenCircuitException>()
                        .OrInner<BrokenCircuitException>()
                        .Fallback(fallbackValue: false, onFallback: (b, context) => { Console.WriteLine("test"); });

        var X = asyncPolicy.WrapAsync<HttpResponseMessage>(fallbackForCircuitBreaker);

        Console.ReadKey();
    }

    public static IAsyncPolicy<HttpResponseMessage> CreateDefaultRetryPolicy()
    {
        var timeoutPolicy = Policy.TimeoutAsync(TimeSpan.FromSeconds(180));

        var waitAndRetryPolicy = Polly.Policy
                .Handle<HttpRequestException>()
                .OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
                .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(3, retryAttempt)),
                (result, timeSpan, context) =>{});

        return timeoutPolicy.WrapAsync(waitAndRetryPolicy);
    }

person user584018    schedule 18.11.2019    source источник


Ответы (1)


При объединении общих политик в PolicyWrap вы может объединять политики только для вызовов, возвращающих один и тот же TResult тип.

Ваш опубликованный код пытается объединить политику, управляющую вызовами, возвращающими HttpResponseMessage, с политикой, управляющей вызовами, возвращающими bool.

Другими словами: вы не можете преобразовать возвращаемый тип вызова в середине PolicyWrap с помощью FallbackPolicy.


Если ваша цель - зафиксировать как результат выполнения, так и общий статус / логическое значение того, было ли оно успешным, см. Синтаксис .ExecuteAndCaptureAsync(...), описанный в readme Polly здесь и здесь.

person mountain traveller    schedule 18.11.2019