具有状态代码转换的AutoRest自定义重试策略

时间:2018-01-24 16:10:40

标签: c# rest autorest

我正在使用一些微服务系统和一个通过AutoRest Generated Clients进行通信的Orchestrator工作。我在调用Orchestrator时遇到问题,Orchestrator进行依赖调用,如果依赖失败,则自动休息重试3次。现在这通常会很好但是因为Orchestrator收到一个失败的响应,它将重试3次,这将重试下游服务3次,每次调用9次。

我已经考虑过以下解决方案,允许下游服务失败并正常返回500内部服务器错误。如果重试失败并且我们收到的最终响应代码是瞬态响应代码,我们将其转换为502.我已经创建了一个自定义的ITransientErrorDetectionStrategy,它不会在502上重试,因此当协调器回放502响应代码时,不重试orchestrator请求。

我的ITransientErrorDetectionStrategy看起来如下:

public class DownStreamFailureStrategy : ITransientErrorDetectionStrategy
{
    public bool IsTransient(Exception ex)
    {
        HttpRequestWithStatusException httpException;
        if ((httpException = ex as HttpRequestWithStatusException) != null)
        {
            if (httpException.StatusCode == HttpStatusCode.RequestTimeout||
                (httpException.StatusCode >= HttpStatusCode.InternalServerError &&
                httpException.StatusCode != HttpStatusCode.NotImplemented &&
                httpException.StatusCode != HttpStatusCode.HttpVersionNotSupported &&
                 httpException.StatusCode != HttpStatusCode.BadGateway))
            {
                return true;
            }
        }

        return false;
    }
}

我遇到的问题是将现有的500响应转换为502,我不想将其留给调用代码来执行此操作,而是将其构建到客户端。我一直在寻找构建自定义RetryDelegatingHandler,但我不确定如何在我的客户端工厂中使用它。

1 个答案:

答案 0 :(得分:0)

您还可以通过更改RetryPolicy来更改重试次数。

public partial class YourAutoGeneratedClient
{
    partial void CustomInitialize()
    {
        var retryPolicy = new RetryPolicy<TransientErrorIgnoreStrategy>(0);
        SetRetryPolicy(retryPolicy);
    }
}