繁体   English   中英

瞬时Polly重试不适用于HttpResponseMessage

[英]Transient Polly retry not working for HttpResponseMessage

嗨,我想暗示波莉重试瞬态错误处理,我在逗我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);
    }

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

throw new HttpResponseException(HttpStatusCode.GatewayTimeout); 

到带有StatusCodeHttpResponseMessage Polly也不执行此操作(Polly对任何委托执行都是通用的,不依赖于HTTP执行)。 您发布的FailedOperation()方法仅抛出HttpResponseException ,纯粹而简单。

该策略未声明为处理HttpResponseException因此它不对其进行处理。 添加子句.Or<HttpResponseException>()如下所示:

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

并且该策略应进行处理,并使测试代码的行为符合我认为的问题。 或者,您可以修改FailedOperation()返回一个HttpResponseMessageHttpStatusCode政策手柄,并再次测试代码应该像预期的那样。

最后,如果该策略是为了保护通过HttpClient进行的异步调用,则您将希望使用策略的异步变体,围绕Http调用Polly自述示例所建议的那样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM