如何重试 401 请求以及 TransientHttpError(5XX 和 408)

use*_*018 -1 c# dotnet-httpclient polly asp.net-core retry-logic

当出现 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))));
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 6

添加.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))));
Run Code Online (Sandbox Code Playgroud)

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

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