Http请求添加Polly策略重试、超时处理
Nuget:
Polly (8.5.2)
Microsoft.Extensions.Http.Polly (8.0.15)
①注入服务配置:
private void AddHttpPolly(IServiceCollection service) { // 创建超时策略 //var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>( // timeout: TimeSpan.FromSeconds(5), //全局超时 5秒 // timeoutStrategy: TimeoutStrategy.Optimistic // 乐观超时(主动取消) // ); //创建重试策略 var retryPolicy = Policy .Handle<HttpRequestException>() .OrResult<HttpResponseMessage>(r => r.StatusCode != HttpStatusCode.OK) .WaitAndRetryAsync(retryCount: 3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),// 指数退避 onRetry: (outcome, delay, attempt, context) => { service.BuildServiceProvider() .GetRequiredService<ILogger<ReturnInstantApplicationModule>>() .LogWarning($"第 {attempt} 次重试,延迟 {delay.TotalSeconds}秒"); }); // 将Polly策略应用到HttpClient service.AddHttpClient("ResilientClient") //.AddPolicyHandler(timeoutPolicy) .AddPolicyHandler(retryPolicy); } public override void ConfigureServices(ServiceConfigurationContext context) { AddHttpPolly(context.Services); }
② http请求
初始化HttpClient
HttpClient _httpClient = httpClientFactory.CreateClient("ResilientClient");
调用(这里例子以Post请求,body参数格式为 x-www-form-urlencoded )
public async Task<(bool,string)> Post(string url, Dictionary<string, string> formData) { var response = await _httpClient.PostAsync( url, new FormUrlEncodedContent(formData)); if (response.StatusCode != HttpStatusCode.OK) { return(false,""); } var responseStr = response.Content.ReadAsStringAsync().Result; return (true, responseStr); }
服务端:
[HttpPost] public IActionResult Post(int code) {var formData = Request.Form; var formValues = new Dictionary<string, string>(); foreach (var key in formData.Keys) { formValues[key] = formData[key]; Console.WriteLine($"key:{key},value:{formData[key]}"); } switch (code) { case 0: return BadRequest("111"); case 1: return Unauthorized("222"); case 2: return NoContent(); case 3: Thread.Sleep(5000); return Ok(new { time = DateTime.Now.ToLocalTime() }); default: return Ok(new { time = DateTime.Now.ToLocalTime() }); } }
效果
调用:

服务端:


浙公网安备 33010602011771号