Files
KJD/Store.Framework/HttpResultParser/HttpResultVerify.cs
T
2026-09-11 19:11:12 +08:00

151 lines
4.5 KiB
C#

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
{
/// <summary>
/// 重新尝试请求
/// </summary>
/// <param name="action">请求方法</param>
/// <param name="retryCount">重试次数</param>
/// <param name="sleepTime">间隔时间</param>
/// <returns></returns>
public static HttpResultVerify TryVerify(Func<HttpResult> action, int retryCount = 3, int sleepTime = 1000)
{
return new HttpResultVerify(action, retryCount, sleepTime);
}
private int retryCount = 3;
private int sleepTime = 1000;
private readonly Func<HttpResult> _action;
private RetryPolicy<HttpResult> retryPolicy;
private List<IHttpResultVerify> _listUse = new List<IHttpResultVerify>();
private List<Func<HttpResult, bool>> _addRetTryList = new List<Func<HttpResult, bool>>();
public HttpResultVerify(Func<HttpResult> action)
{
_action = action;
retryPolicy = TryHttpExec(_action);
}
public HttpResultVerify(Func<HttpResult> action, int RetryCount) : this(action)
{
retryCount = RetryCount;
}
public HttpResultVerify(Func<HttpResult> action, int RetryCount, int SleepTime) : this(action, RetryCount)
{
sleepTime = SleepTime;
}
/// <summary>
/// 添加检测Http返回
/// </summary>
/// <typeparam name="T"></typeparam>
public void UseCheckResult<T>() where T : IHttpResultVerify, new()
{
_listUse.Add(new T());
}
/// <summary>
/// 添加检测Http返回
/// </summary>
/// <typeparam name="T"></typeparam>
public void UseCheckResult<T>(T checkResult) where T : IHttpResultVerify
{
_listUse.Add(checkResult);
}
/// <summary>
/// 添加 是否再次尝试 true 再次尝试 false 不再尝试
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public HttpResultVerify AddRetTry(Func<HttpResult, bool> func)
{
_addRetTryList.Add(func);
return this;
}
/// <summary>
/// 执行
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 尝试执行
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
private RetryPolicy<HttpResult> TryHttpExec(Func<HttpResult> action, int sleepTime = 1000)
{
if (retryCount == 0)
{
retryCount = 3;
}
var retryPolicy = Policy
.Handle<Exception>(a =>
{
if (a.Message == "登录失效")
{
return false;
}
return true;
})
.OrResult<HttpResult>(RetTry)
.WaitAndRetry(retryCount, retryAttempt =>
{
return TimeSpan.FromMilliseconds(sleepTime);
}
, (ex, timespan, retryindex, context) =>
{
Console.WriteLine($"开始第 {retryindex} 次重试:");
});
return retryPolicy;
}
}
}