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