首页 > 解决方案 > Polly - 从 HTTP 响应内容评估瞬时故障的策略处理程序

问题描述

我在 ASP.NET Core Web API 中使用 Refit、Polly 和 Polly.Extensions.Http 来调用一些外部 API。

我正在尝试使用 Polly 添加一个策略处理程序,它可以根据正文内容重试,因为我正在使用的外部 API,不使用 HTTP 状态代码返回操作结果,而是将操作结果放在一个公共返回的正文中目的。所以它总是会返回 200 OK 但它可能表明它失败了一个有Success=false和属性中的一些错误的主体Errors。以下是始终返回的响应对象属性:

public abstract class ApiResultResponse 
{
    public string RequestId { get; set; }
    public List<string> Warnings { get; set; }
    public List<Error> Errors { get; set; }
    public bool Success { get; set; }
}

尝试使用AddPolicyHandler方法调用在此处添加异步重试策略。

但我不确定如何使用 Polly 正确创建 retryPolicy 对象,该对象将创建所需的功能。

services.AddRefitClient<ISomeApi>(refitSettings)
    .ConfigureHttpClient(c => {
        c.BaseAddress = someApiBaseUrl;
    })
    .AddPolicyHandler(retryPolicy)

我想将此功能添加到一堆 API,因为一个常见的情况是调用这些 API 可能会导致速率限制失败,但我需要评估ApiResultResponse对象Errors属性以确定原因是否是失败的速率限制。我想在全局级别处理这些并自动重试,而不是在服务中处理下游。

标签: c#dotnet-httpclientpolly

解决方案


使用HandleResult可以指定触发器,该触发器基于修饰方法的返回值。

AsyncRetryPolicy<ApiResultResponse> retryPolicy = Policy
       .HandleResult<ApiResultResponse>(r => r.Success == false && r.Errors?.Count > 0)
       .WaitAndRetryAsync(2, _ => TimeSpan.FromSeconds(2));

参考文献:[1][2]


推荐阅读