我使用 Polly v8 和 .NET Framework 4.7.2 仅重试特定状态响应。但是,当尝试将重试限制为仅这些状态时,代码将不再调用重试行为。
值得注意的是,在 HttpRequestException 上添加句柄是可行的,但会开始重试其他状态代码,其中首选只是快速失败并记录
请看下面的例子:
public ResiliencePipilineBuilder<HttpResponseMessage> BuildStrategy()
{
var statusCodes = new List<HttpStatusCode>
{
HttpStatusCode.InternalServerError
};
PredicateBuilder<HttpResponseMessage> predicateBuilder = new PredicateBuilder<HttpResponseMessage>()
// .Handle<HttpRequestException>() NOTE: this would work see explanation
.HandleResult(response => statusCodes.Contains(response.StatusCode));
...
return new ResiliencePipilineBuilder<HttpResponseMessage>()
.AddRetry(new RetryStrategyOptions<HttpResponseMessage>()
{
ShouldHandle = predicateBuilder,
...
});
}
public async Task<Data> SendIt()
{
var strategy = BuildStrategy();
var result = strategy.ExecuteAsync(async token =>
{
var response = await client.SendAsync()
response.EnsureSuccessStatusCode();
...
})
}
HandleResult可以单独使用,以新的v8风格只捕获我想要的请求吗? 我是否必须恢复到 v7 方法?
Polly 文档确实展示了两种方法(Handle 和 HandleResult),但作为一对而不是单独展示
问题的根本原因不在策略定义内部,而不是在装饰方法内部:
response.EnsureSuccessStatusCode();
如果
HttpRequestException
返回 false,此代码将抛出 IsSuccessStatusCode
。因此,只要状态代码不在以下范围内:200-299。
如果您删除此检查,那么您的策略将以例外的方式起作用。