Polly v8 - 使用 PredicateBuilder 重试特定状态代码

问题描述 投票:0回答:1

我使用 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),但作为一对而不是单独展示

c# .net dotnet-httpclient http-status-codes polly
1个回答
0
投票

问题的根本原因不在策略定义内部,而不是在装饰方法内部:

response.EnsureSuccessStatusCode();

如果

HttpRequestException
返回 false,此代码将抛出
IsSuccessStatusCode
。因此,只要状态代码不在以下范围内:200-299。

如果您删除此检查,那么您的策略将以例外的方式起作用。

© www.soinside.com 2019 - 2024. All rights reserved.