增加项目,分层
This commit is contained in:
1 parent
6e995a5bdb
commit
0a3e5af6a9
234 files changed
+26994
-1
No files matched your search
@@ -0,0 +1,150 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user