[英]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);
到带有StatusCode
的HttpResponseMessage
。 Polly也不执行此操作(Polly对任何委托执行都是通用的,不依赖于HTTP执行)。 您发布的FailedOperation()
方法仅抛出HttpResponseException
,纯粹而简单。
该策略未声明为处理HttpResponseException
因此它不对其进行处理。 添加子句.Or<HttpResponseException>()
如下所示:
var retryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => /* etc */)
.Or<HttpResponseException>();
并且该策略应进行处理,并使测试代码的行为符合我认为的问题。 或者,您可以修改FailedOperation()
返回一个HttpResponseMessage
与HttpStatusCode
政策手柄,并再次测试代码应该像预期的那样。
最后,如果该策略是为了保护通过HttpClient
进行的异步调用,则您将希望使用策略的异步变体,如围绕Http调用的Polly自述示例所建议的那样 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.