151 lines
4.5 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|