我有以下客户端应用程序
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);
})
// ...
,如下图所示:
那么如何返回 408 状态码供 Polly 消费呢?
如果您的服务器已关闭并且您无法从中获得响应,那么您将收到
TaskCanceledException
或者每个请求可以有 5 秒的超时。
前一种情况由HttpRequestException
处理,因为它处理
HandleTransientHttpError
、Http 状态代码 >= 500(服务器错误)和状态代码 408(请求超时)。后一种情况可以通过组合/链接
内部策略将是您的超时,它将分别应用于每次重试尝试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);
}