如何向 Polly 返回 408 请求超时,以便其应用重试策略?

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

我有以下客户端应用程序

services
    .AddHttpClient<IOrderService, OrderService>(c =>
    {
        c.BaseAddress = new Uri(Configuration["ApiSettings:xxx"]);
    })
    .AddPolicyHandler(GetRetryPolicy())


private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return
        HttpPolicyExtensions
            .HandleTransientHttpError()
            .WaitAndRetryAsync(
                retryCount: 3,
                sleepDurationProvider: currNthRetry => TimeSpan.FromSeconds(Math.Pow(2, currNthRetry)),
                onRetry: (Exception, retryCount, context) =>
                {
                    // ...
                });

}

所以当服务器关闭/关闭时,我的客户端应用程序只是挂起,Polly 不应用重试策略,我认为这是因为 Polly 期望首先收到 408 请求超时的 http 状态代码,然后它可以重试,但是服务器已关闭,服务器无法生成 408 错误代码并将其发送回确定。那么如何设置 Polly 的默认超时时间呢?

我试图将超时设置为:

HttpClient

但它不起作用,我得到的只是一个
services .AddHttpClient<IOrderService, OrderService>(c => { // ... c.Timeout = TimeSpan.FromSeconds(5); }) // ...

,如下图所示:

Polly 仍然没有进行任何重试。

那么如何返回 408 状态码供 Polly 消费呢?

c# .net timeout polly retry-logic
1个回答
0
投票
我希望客户端应用程序每 5 秒重试一次请求,仅重试 3 次,仅此而已。我遇到的问题是,由于服务器已关闭,服务器无法将 5XX 或 4XX 返回给客户端。所以 HttpClient 需要为 Polly 生成 408

如果您的服务器已关闭并且您无法从中获得响应,那么您将收到
TaskCanceledException

或者每个请求可以有 5 秒的超时。

前一种情况由 

HttpRequestException

处理,因为它处理

HandleTransientHttpError
、Http 状态代码 >= 500(服务器错误)和状态代码 408(请求超时)。
后一种情况可以通过

组合/链接

两个策略来实现。 HttpRequestException

内部策略将是您的超时,它将分别应用于每次重试尝试
  • 外部策略将是您的重试,它知道可能的超时(
  • IAsyncPolicy<HttpResponseMessage> GetPolicy() { var timeout = Policy .TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(5)); var retry = HttpPolicyExtensions .HandleTransientHttpError() .Or<TimeoutRejectedException>() .WaitAndRetryAsync( retryCount: 3, sleepDurationProvider: _ => TimeSpan.FromSeconds(Math.Pow(2, _))); return Policy.WrapAsync(retry, timeout); }
  • )
    
        
© www.soinside.com 2019 - 2024. All rights reserved.