using MAX.Core.Helpers; using Polly; using Polly.Retry; using System; using System.Collections.Generic; using System.Net; namespace Store.Framework.HttpResultParser { public class HttpResultVerify { /// /// 重新尝试请求 /// /// 请求方法 /// 重试次数 /// 间隔时间 /// public static HttpResultVerify TryVerify(Func action, int retryCount = 3, int sleepTime = 1000) { return new HttpResultVerify(action, retryCount, sleepTime); } private int retryCount = 3; private int sleepTime = 1000; private readonly Func _action; private RetryPolicy retryPolicy; private List _listUse = new List(); private List> _addRetTryList = new List>(); public HttpResultVerify(Func action) { _action = action; retryPolicy = TryHttpExec(_action); } public HttpResultVerify(Func action, int RetryCount) : this(action) { retryCount = RetryCount; } public HttpResultVerify(Func action, int RetryCount, int SleepTime) : this(action, RetryCount) { sleepTime = SleepTime; } /// /// 添加检测Http返回 /// /// public void UseCheckResult() where T : IHttpResultVerify, new() { _listUse.Add(new T()); } /// /// 添加检测Http返回 /// /// public void UseCheckResult(T checkResult) where T : IHttpResultVerify { _listUse.Add(checkResult); } /// /// 添加 是否再次尝试 true 再次尝试 false 不再尝试 /// /// /// public HttpResultVerify AddRetTry(Func func) { _addRetTryList.Add(func); return this; } /// /// 执行 /// /// public HttpResult Exec() { return retryPolicy.Execute(() => { var result = _action(); foreach (var item in _listUse) { result = item.CheckResult(result); } return result; }); } private bool RetTry(HttpResult result) { //返回结果状态判断 再次执行 var ret = false; ret = result.StatusCode != HttpStatusCode.OK; foreach (var item in _listUse) { ret = item.RetTry(result); if (ret) { break; } } if (!ret) { foreach (var item in _addRetTryList) { ret = item(result); if (ret) { break; } } } return ret; } /// /// 尝试执行 /// /// /// private RetryPolicy TryHttpExec(Func action, int sleepTime = 1000) { if (retryCount == 0) { retryCount = 3; } var retryPolicy = Policy .Handle(a => { if (a.Message == "登录失效") { return false; } return true; }) .OrResult(RetTry) .WaitAndRetry(retryCount, retryAttempt => { return TimeSpan.FromMilliseconds(sleepTime); } , (ex, timespan, retryindex, context) => { Console.WriteLine($"开始第 {retryindex} 次重试:"); }); return retryPolicy; } } }