mh_frame_sps/APT.Infrastructure.Api/Api/BaseApiController.cs

203 lines
7.3 KiB
C#
Raw Permalink Normal View History

2026-04-07 13:47:52 +08:00
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;
}
}
}