使用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>();