203 lines
7.3 KiB
C#
203 lines
7.3 KiB
C#
|
|
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
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 抛出错误
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="code"></param>
|
|||
|
|
protected void ThrowError(string code, params object [] objs)
|
|||
|
|
{
|
|||
|
|
LibMessageUtils.ThrowError(code,objs);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="TResult">返回值类型</typeparam>
|
|||
|
|
/// <param name="execAction"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
protected virtual JsonActionResult<TResult> SafeExecute<TResult>(Func<TResult> execAction, int retryTime = 0)
|
|||
|
|
{
|
|||
|
|
var result = new JsonActionResult<TResult>();
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="TResult">返回值类型</typeparam>
|
|||
|
|
/// <param name="execAction"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
protected virtual async Task<JsonActionResult<TResult>> SafeExecuteAsync<TResult>(Func<Task<TResult>> execAction, int retryTime = 0)
|
|||
|
|
{
|
|||
|
|
var result = new JsonActionResult<TResult>();
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 为 基础操作 提供统一的返回格式,包含try / catch操作。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="TResult">返回值类型</typeparam>
|
|||
|
|
/// <param name="execAction"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
protected JsonActionResult<TResult> SafeJsonExecute<TResult>(Action<JsonActionResult<TResult>> execAction)
|
|||
|
|
{
|
|||
|
|
var result = new JsonActionResult<TResult>();
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 为取 分页数据 提供统一的返回格式,包含try / catch操作。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="TResult">返回值类型</typeparam>
|
|||
|
|
/// <param name="execAction"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
protected PagedActionResult<TResult> SafeGetPagedData<TResult>(Action<PagedActionResult<TResult>> execAction)
|
|||
|
|
{
|
|||
|
|
var result = new PagedActionResult<TResult>();
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据Request中的QueryString获得Linq表达式
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="TEntity">实体对象</typeparam>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
protected Expression<Func<TEntity, bool>> GetExpressionFromQueryString<TEntity>()
|
|||
|
|
{
|
|||
|
|
Expression<Func<TEntity, bool>> 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<TEntity>(null);
|
|||
|
|
}
|
|||
|
|
return expr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|