实验服务保护,自动重新连接功能。
2.1 重复工具
- using Polly;
- using Polly.Retry;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Http;
- using System.Threading.Tasks;
-
- namespace WebApplication2
- {
- public class ClientPolicy
- {
- public AsyncRetryPolicy<HttpResponseMessage> asyncRetryPolicy { get; set; }
- public ClientPolicy()
- {
- asyncRetryPolicy = Policy.HandleResult<HttpResponseMessage>(p=>!p.IsSuccessStatusCode).WaitAndRetryAsync(5,retryAttemp=>TimeSpan.FromSeconds(Math.Pow(2,retryAttemp)));
- }
- }
- }
2.2 调用位置
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Logging;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Http;
- using System.Threading.Tasks;
-
- namespace WebApplication2.Controllers
- {
- [ApiController]
- [Route("[controller]")]
- public class WeatherForecastController : ControllerBase
- {
- private static readonly string[] Summaries = new[]
- {
- "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
- };
-
- private readonly ILogger<WeatherForecastController> _logger;
-
- public WeatherForecastController(ILogger<WeatherForecastController> logger)
- {
- _logger = logger;
- }
-
- [HttpGet]
- public IEnumerable<WeatherForecast> Get()
- {
- var rng = new Random();
- ClientPolicy clientPolicy = new ClientPolicy();
- HttpClient httpClient = new HttpClient();
- clientPolicy.asyncRetryPolicy.ExecuteAsync(() => httpClient.GetAsync($"https://localhost:44367/test"));
-
-
- return Enumerable.Range(1, 5).Select(index => new WeatherForecast
- {
- Date = DateTime.Now.AddDays(index),
- TemperatureC = rng.Next(-20, 55),
- Summary = Summaries[rng.Next(Summaries.Length)]
- })
- .ToArray();
- }
-
- [HttpGet("/test")]
- public IActionResult test()
- {
- var randomNumber = new Random().Next(1, 100);
- if(randomNumber > 20)
- {
- //Console.WriteLine("请求成功 200");
- //return Ok("请求成功");
- }
- Console.WriteLine("请求失败");
- return BadRequest("请求失败");
- }
- }
- }
2.实验结果
如果失败下面的函数会重复调用5次
- [HttpGet("/test")]
- public IActionResult test()
- {
- var randomNumber = new Random().Next(1, 100);
- if(randomNumber > 20)
- {
- //Console.WriteLine("请求成功 200");
- //return Ok("请求成功");
- }
- Console.WriteLine("请求失败");
- return BadRequest("请求失败");
- }