using APT.Infrastructure.Api.Model;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using APT.Infrastructure.Core;
namespace APT.Infrastructure.Api
{
//[Log]
public abstract class BaseApiController : ControllerBase
{
///
/// 抛出错误
///
///
protected void ThrowError(string code, params object [] objs)
{
LibMessageUtils.ThrowError(code,objs);
}
///
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
///
/// 返回值类型
///
///
protected virtual JsonActionResult SafeExecute(Func execAction, int retryTime = 0)
{
var result = new JsonActionResult();
try
{
result.Data = execAction();
}
catch (CodeException ex)
{
LoggerManager.GetLogger().Error(ex.ToString());
result.IsSuccessful = false;
result.ErrorMessage = GetErrorMsg(ex);
result.Code = ex.Code;
}
catch (Exception ex)
{
if (NeedRetryExceptions.RetryExceptions().Any(o => ex.Message.Contains(o)) && retryTime <= 3 && retryTime > 0)
{
retryTime += 1;
Thread.Sleep(5000);
return this.SafeExecute(execAction, retryTime);
}
var errMsg = LogHelper.GetCurSourceFileName() + " - " + LogHelper.GetLineNum() + ":" + ex.Message;
LoggerManager.GetLogger().Error(errMsg);
result.IsSuccessful = false;
result.ErrorMessage = errMsg;
}
return result;
}
///
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
///
/// 返回值类型
///
///
protected virtual async Task> SafeExecuteAsync(Func> execAction, int retryTime = 0)
{
var result = new JsonActionResult();
try
{
result.Data = await execAction();
}
catch (CodeException ex)
{
LoggerManager.GetLogger().Error(ex.ToString());
result.IsSuccessful = false;
result.ErrorMessage = GetErrorMsg(ex);
result.Code = ex.Code;
}
catch (Exception ex)
{
if (NeedRetryExceptions.RetryExceptions().Any(o => ex.Message.Contains(o)) && retryTime <= 3 && retryTime >0)
{
retryTime += 1;
Thread.Sleep(5000);
return await this.SafeExecuteAsync(execAction, retryTime);
}
var errMsg = LogHelper.GetCurSourceFileName() + " - " + LogHelper.GetLineNum() + ":" + ex.Message;
LoggerManager.GetLogger().Error(errMsg);
result.IsSuccessful = false;
result.ErrorMessage = errMsg;
}
return result;
}
protected string GetErrorMsg(Exception ex)
{
string innerError = string.Empty;
GetInnerErrorMsg(ex.InnerException, ref innerError);
return ex.Message + (!string.IsNullOrEmpty(innerError) ? (",报错明细:" + innerError) : string.Empty);
}
private void GetInnerErrorMsg(Exception ex, ref string error)
{
if (ex == null) return;
error = ex.Message;
GetInnerErrorMsg(ex.InnerException, ref error);
}
///
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
///
/// 返回值类型
///
///
protected JsonActionResult SafeJsonExecute(Action> execAction)
{
var result = new JsonActionResult();
try
{
execAction(result);
}
catch (CodeException ex)
{
LoggerManager.GetLogger().Error(ex.ToString());
result.IsSuccessful = false;
result.ErrorMessage = GetErrorMsg(ex);
result.Code = ex.Code;
}
catch (Exception ex)
{
var errMsg = LogHelper.GetCurSourceFileName() + " - " + LogHelper.GetLineNum() + ":" + ex.Message;
LoggerManager.GetLogger().Error(errMsg);
result.IsSuccessful = false;
result.ErrorMessage = errMsg;
}
return result;
}
///
/// 为取 分页数据 提供统一的返回格式,包含try / catch操作。
///
/// 返回值类型
///
///
protected PagedActionResult SafeGetPagedData(Action> execAction)
{
var result = new PagedActionResult();
try
{
execAction(result);
}
catch (CodeException ex)
{
LoggerManager.GetLogger().Error(ex.ToString());
result.IsSuccessful = false;
result.ErrorMessage = GetErrorMsg(ex);
result.Code = ex.Code;
}
catch (Exception ex)
{
var errMsg = LogHelper.GetCurSourceFileName() + " - " + LogHelper.GetLineNum() + ":" + ex.Message;
LoggerManager.GetLogger().Error(errMsg);
result.IsSuccessful = false;
result.ErrorMessage = errMsg;
}
return result;
}
///
/// 根据Request中的QueryString获得Linq表达式
///
/// 实体对象
///
protected Expression> GetExpressionFromQueryString()
{
Expression> expr = null;
var queryPairs = Request.Query.ToDictionary(q => q.Key, q => q.Value).Where(q => q.Key.Equals("$format") == false);
if (queryPairs.Count() > 0)
{
var filterGroup = new FilterGroup();
foreach (var pairItem in queryPairs)
{
filterGroup.Rules.Add(new FilterRule(pairItem.Key, pairItem.Value));
}
expr = filterGroup.BuildExpression(null);
}
return expr;
}
}
}