我正在使用Polly v8和. NET framework 4.7.2只重试特定的状态响应.但是,当试图将重试限制为仅这些状态时,代码将不再调用重试行为.

值得注意的是,在HttpRequestException上添加一个Handle可以工作,但在其他状态代码上,如果首选的只是快速失败并记录,

请看下面的例子:

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();

        ...
    })
}

在新的V8风格中,是否可以单独使用HandleResult来捕获我想要的请求? 我将不得不恢复到v7方法吗?

Polly的文档显示了这两种方法(HandleHandleResult),但它们是成对的,而不是单独的

推荐答案

问题的根本原因不在策略定义中,而不在修饰方法中:

response.EnsureSuccessStatusCode();

如果IsSuccessStatusCode返回false,则该代码将抛出HttpRequestException.因此,当状态代码不在以下范围内时:200—299.

如果你删除了这个判断,那么你的策略将以例外的方式工作.

Csharp相关问答推荐

在Microsoft XNA框架(MonoGame)中旋转相机

在包含空项的列表上使用具有断言T的摘要表

为什么EF Core 6会针对null验证Count(*)?

`Task`只有在C#中等待时才会运行吗?

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

如何在页面重新加载后保持菜单切换状态

Blazor在FluentButton onClick事件上设置参数

调用Task.Run()与DoSomethingAsync()有什么不同?

C#Null判断处理失败

我可以查看我们向应用程序洞察发送了多少数据吗?

忽略Visual Studio代码中的StyleCop规则

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

如何在.NET Core 8中自定义标识用户模型

如何读取TagHelper属性的文本值?

如何使用LINQ在C#中填充列表列表?

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄

在Swagger中显示自定义属性的属性名称

ASP.NET核心中的验证错误-该字段为必填字段

更新实体框架上的被跟踪实体