mh_frame_sps/APT.Infrastructure.Api/Api/BaseApiController.cs
2026-04-07 13:47:52 +08:00

203 lines
7.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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