瞬时Polly重试不适用于HttpResponseMessage

时间:2018-09-18 05:08:53

标签: c# asp.net asp.net-mvc http-response-codes 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 :(得分:0)

自定义FailedOperation()方法不涉及任何相关的.NET Framework /ASP.NET基础结构,因此您要测试的代码执行不会神奇地转换:

throw new HttpResponseException(HttpStatusCode.GatewayTimeout); 

到一个HttpResponseMessage的{​​{1}}。 Polly也不执行此操作(Polly对任何委托执行都是通用的,不依赖于HTTP执行)。您发布的StatusCode方法只会抛出FailedOperation(),既简单又简单。

该策略未声明处理HttpResponseException,因此它不处理它。像这样添加子句HttpResponseException

.Or<HttpResponseException>()

,该策略应处理它并使测试代码按我认为的问题预期的方式运行。或者,您可以修改var retryPolicy = Policy .HandleResult<HttpResponseMessage>(r => /* etc */) .Or<HttpResponseException>(); 以返回带有策略处理的FailedOperation()的{​​{1}},并且测试代码的行为应与预期相同。

最后,如果该策略是为了保护通过HttpResponseMessage进行的异步调用,则您希望使用async variants of policies作为Polly readme examples around Http calls suggest