使用NuGet包管理添加Microsoft.Extensions.Http.Polly引用,項目是.netcore2.1版本,因此Polly添加也是2.1版本,如自己.netcore版本比較高,可以選擇高版本,目前最新的是3.1版本。
using Microsoft.Extensions.DependencyInjection; using Polly; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; namespace MyProject.Extentions { public static class HttpRetryExtension { public static void AddRetryProxy<TCient>(this IServiceCollection services) where TCient : class { //重試策略 var retryPolicy = Policy.Handle<HttpRequestException>()//指定要處理的異常 .Or<Exception>() .OrResult<HttpResponseMessage>(res => { return res.StatusCode != System.Net.HttpStatusCode.OK; })//返回結果不是Ok重試 .WaitAndRetryAsync( //指定重試次數 sleepDurations: new[] { TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(200), TimeSpan.FromMilliseconds(300) }, //出異常會執行以下代碼 onRetry: (exception, ts, context) => { Console.WriteLine($"polly.retry:exMsg={ exception.Exception?.Message}, {ts.Minutes * 60 + ts.Seconds}"); }); //超時策略 var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(30);//超時30秒重試 services.AddHttpClient<TCient>() .AddPolicyHandler(retryPolicy) .AddPolicyHandler(timeoutPolicy); } } }
在Startup類中ConfigureServices方法,對需要重試請求的http請求Service添加注入即可。
public void ConfigureServices(IServiceCollection services) { //http services.AddRetryProxy<IdentityOCRService>();