Временная повторная попытка Полли не работает для HttpResponseMessage - PullRequest
0 голосов
/ 18 сентября 2018

Привет, я хочу повлиять на временную обработку ошибок при повторных попытках polly. Я забавляю код beow, но повторная попытка не работает для меня, пожалуйста, дайте мне знать, где я ошибаюсь.

 var retryPolicy = Policy
        .HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized

                                           || r.StatusCode == HttpStatusCode.GatewayTimeout
                                           || r.StatusCode == HttpStatusCode.RequestTimeout
                                           || r.StatusCode == HttpStatusCode.ServiceUnavailable)
    .WaitAndRetry(3, i => TimeSpan.FromSeconds(2), (result, timeSpan, retryCount, context) =>
    {
        Console.WriteLine($"Request failed with {result.Result.StatusCode}. Waiting {timeSpan} before next retry. Retry attempt {retryCount}");
    });

    retryPolicy.Execute(() =>
   {
        response = FailedOperation();
       return response;

   });

     private static HttpResponseMessage FailedOperation()
    {
 Console.WriteLine("Exception !!!!!");

    throw new HttpResponseException(HttpStatusCode.GatewayTimeout);
    }

1 Ответ

0 голосов
/ 18 сентября 2018

Пользовательский метод FailedOperation() не включает в себя какую-либо связанную инфраструктуру .NET Framework /ASP.NET, поэтому выполнение кода, которое вы тестируете, не будет магическим образом преобразовываться:

throw new HttpResponseException(HttpStatusCode.GatewayTimeout); 

до HttpResponseMessage с StatusCode. Полли также не делает этого (Полли является общим для любого выполнения делегата, не привязанным к http-выполнению). Метод FailedOperation(), который вы опубликовали, просто создает HttpResponseException, чистый и простой.

Политика не объявлена ​​для обработки HttpResponseException, поэтому она не обрабатывает ее. Добавить предложение .Or<HttpResponseException>() как это:

var retryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => /* etc */)
    .Or<HttpResponseException>();

и политика должна обработать это и заставить тестовый код вести себя так, как я думаю, что вопрос ожидает. В качестве альтернативы, вы можете изменить FailedOperation(), чтобы он возвращал HttpResponseMessage с HttpStatusCode, который обрабатывает политика, и снова тестовый код должен работать так, как ожидалось.

Наконец, если политика должна защищать асинхронные вызовы через HttpClient, вы захотите использовать асинхронные варианты политик , так как Примеры readme Polly для вызовов Http предполагают .

...