1. 概要
实验服务保护,自动重新连接功能。
2.代码
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("请求失败");
}