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