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;
}
}
}