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() });
            }
        }

效果

调用:

 

服务端:

 

posted @ 2025-04-18 14:54  点终将连成线  阅读(51)  评论(0)    收藏  举报