【问题标题】:how to re-try request for 401 along with TransientHttpError ( 5XX and 408)如何与 TransientHttpError 一起重试 401 请求(5XX 和 408)
【发布时间】:2021-10-30 15:20:58
【问题描述】:

当我们遇到来自 HttpRequestException、5XX 和 408 的错误时,以下代码重试 2 次,它工作正常。

这里我想重试甚至401 错误?我们如何通过 Polly 实现这一目标?

 services.AddHttpClient(Options.DefaultName)
            .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { })
            .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError()
                .WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));

【问题讨论】:

  • 您选择.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { }) 的原因是什么?不手动指定不是已经默认了吗?
  • 如果收到Unauthorized,为什么要重试相同的请求?发出相同的请求通常不会给您新的凭据。还是我错过了什么?
  • 我们将在 401 情况下再次执行 ReAuthorize。
  • @user584018 确切地说,每当您遇到 401 时,您都希望执行特定操作,而不是发出相同的请求。这就是为什么我不明白为什么要将 401 包含到您的通用重试逻辑中。

标签: c# asp.net-core polly


【解决方案1】:

.OrResult(r => r.StatusCode == System.Net.HttpStatusCode.Unauthorized) 添加到您的代码中:

services.AddHttpClient(Options.DefaultName)
        .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { })
        .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError()
        .OrResult(r => r.StatusCode == System.Net.HttpStatusCode.Unauthorized)
        .WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));

我建议您像这样重写您的代码以使其更易于阅读:

services.AddHttpClient(Options.DefaultName)
        .AddTransientHttpErrorPolicy(builder => 
            builder
                .OrResult(r => r.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                .WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))))
        );

【讨论】:

  • 会不会只重试401,如果500来了怎么办?
  • HandleTransientHttpError,您已经拥有,处理 5xx 和 408。
  • 如果我想在重试请求之前做一些事情,比如 OAuth 身份验证?
  • @AngeloBernardi 我通常会为此创建一个DelegatingHandler。然后您可以使用.AddHttpMessageHandler<MyDelegatingHandlerType>() 注册它
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2020-09-15
  • 2010-12-12
  • 2016-02-01
  • 1970-01-01
  • 2019-08-12
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多