/// <summary>
        ///     设置异常信息到日志文件和数据库
        /// </summary>
        private void SetExceptionMsg(ActionExecutedContext resultContext, ActionExecutingContext context,
                                     LogApiEntity logApiEntity)
        {
            if (resultContext.Exception != null)
            {
                #region 异常获取

                var sbException = new StringBuilder();
                var exception   = resultContext.Exception;
                sbException.AppendLine(exception.Message);
                while (exception.InnerException != null)
                {
                    sbException.AppendLine(exception.InnerException.Message);
                    exception = exception.InnerException;
                }

                sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000));

                #endregion

                logApiEntity.ExecuteResult = sbException.ToString();
                logApiEntity.LogStatus     = OperateStatusEnum.Fail.ParseToInt();
            }
            else
            {
                var result = context.Result as ObjectResult;
                if (result != null)
                {
                    logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value);
                    logApiEntity.LogStatus     = OperateStatusEnum.Success.ParseToInt();
                }
            }
        }
예제 #2
0
        public async Task <TData <string> > SaveForm(LogApiEntity entity)
        {
            TData <string> obj = new TData <string>();
            await logApiService.SaveForm(entity);

            obj.Data = entity.Id.ParseToString();
            obj.Tag  = 1;
            return(obj);
        }
예제 #3
0
 public async Task SaveForm(LogApiEntity entity)
 {
     if (entity.Id.IsNullOrZero())
     {
         await entity.Create();
         await this.BaseRepository().Insert<LogApiEntity>(entity);
     }
     else
     {
         await this.BaseRepository().Update<LogApiEntity>(entity);
     }
 }
예제 #4
0
 public async Task SaveForm(LogApiEntity entity)
 {
     if (entity.Id.IsNullOrZero())
     {
         // 默认赋值
         entity.Id = IdGeneratorHelper.Instance.GetId();
         ;
         await _logApiEntityDB.InsertNowAsync(entity);
     }
     else
     {
         await _logApiEntityDB.UpdateNowAsync(entity, ignoreNullValues : true);
     }
 }
        /// <summary>
        ///     保存日志到数据库
        /// </summary>
        private async Task SaveLogAPI(LogApiEntity logApiEntity)
        {
            try
            {
                logApiEntity.ExecuteParam  = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000);
                logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000);
                logApiEntity.Id            = IdGeneratorHelper.Instance.GetId();
                logApiEntity.CreateTime    = DateTime.Now;

                // 踩坑:此处使用三方包进行保存,因为当接口采用自动事务管理时,如果此处也使用EF,会被一并回滚,导致无法正常记录
                var logApiDB = App.GetService <ISqlSugarRepository <LogApiEntity> >();
                await logApiDB.InsertAsync(logApiEntity);
            }
            catch (Exception ex)
            {
                LogHelper.Error("日志记录到数据库时发生错误", ex);
            }
        }
예제 #6
0
        /// <summary>
        /// 异步接口日志
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            //先校验header
            CheckAppSign(context);

            Stopwatch sw = new Stopwatch();

            sw.Start();

            var resultContext = await next();

            sw.Stop();
            string token = context.HttpContext.Request.Query["token"].ParseToString();

            #region 保存日志
            LogApiEntity logApiEntity = new LogApiEntity();
            logApiEntity.ExecuteUrl = context.HttpContext.Request.Path;
            logApiEntity.LogStatus  = OperateStatusEnum.Success.ParseToInt();

            #region 获取Post参数
            switch (context.HttpContext.Request.Method.ToUpper())
            {
            case "GET":
                logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                break;

            case "POST":
                Dictionary <string, string> param = new Dictionary <string, string>();
                if (context.HttpContext.Request.HasFormContentType)
                {
                    foreach (var k in context.HttpContext.Request.Form)
                    {
                        if (!param.ContainsKey(k.Key))
                        {
                            if (!string.IsNullOrEmpty(k.Value[0]))
                            {
                                param.Add(k.Key, k.Value[0]);
                            }
                        }
                    }
                }
                if (param.Count > 0)
                {
                    logApiEntity.ExecuteUrl  += context.HttpContext.Request.QueryString.Value.ParseToString();
                    logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(param), 4000);
                }
                else
                {
                    logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                }
                break;
            }
            #endregion

            if (resultContext.Exception != null)
            {
                #region 异常获取
                StringBuilder sbException = new StringBuilder();
                Exception     exception   = resultContext.Exception;
                sbException.AppendLine(exception.Message);
                while (exception.InnerException != null)
                {
                    sbException.AppendLine(exception.InnerException.Message);
                    exception = exception.InnerException;
                }
                sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000));
                #endregion

                logApiEntity.ExecuteResult = sbException.ToString();
                logApiEntity.LogStatus     = OperateStatusEnum.Fail.ParseToInt();
            }
            else
            {
                ObjectResult result = context.Result as ObjectResult;
                if (result != null)
                {
                    logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value);
                    logApiEntity.LogStatus     = OperateStatusEnum.Success.ParseToInt();
                }
            }
            OperatorInfo user = await Operator.Instance.Current(token);

            if (user != null)
            {
                logApiEntity.BaseCreatorId = user.UserId;
            }
            logApiEntity.ExecuteParam  = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000);
            logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000);
            logApiEntity.ExecuteTime   = sw.ElapsedMilliseconds.ParseToInt();

            Action taskAction = async() =>
            {
                // 让底层不用获取HttpContext
                logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0;

                await new LogApiBLL().SaveForm(logApiEntity);
            };
            AsyncTaskHelper.StartTask(taskAction);
            #endregion
        }
예제 #7
0
        /// <summary>
        /// 异步接口日志
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            var resultContext = await next();

            sw.Stop();
            #region 保存日志
            LogApiEntity logApiEntity = new LogApiEntity();
            logApiEntity.ExecuteUrl = context.HttpContext.Request.Path;
            logApiEntity.LogStatus  = OperateStatusEnum.Success.ParseToInt();

            #region 获取Post参数
            switch (context.HttpContext.Request.Method.ToUpper())
            {
            case "GET":
                logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                break;

            case "POST":
                if (context.ActionArguments?.Count > 0)
                {
                    logApiEntity.ExecuteUrl  += context.HttpContext.Request.QueryString.Value.ParseToString();
                    logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000);
                }
                else
                {
                    logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                }
                break;
            }
            #endregion

            if (resultContext.Exception != null)
            {
                #region 异常获取
                StringBuilder sbException = new StringBuilder();
                Exception     exception   = resultContext.Exception;
                sbException.AppendLine(exception.Message);
                while (exception.InnerException != null)
                {
                    sbException.AppendLine(exception.InnerException.Message);
                    exception = exception.InnerException;
                }
                sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000));
                #endregion

                logApiEntity.ExecuteResult = sbException.ToString();
                logApiEntity.LogStatus     = OperateStatusEnum.Fail.ParseToInt();
            }
            else
            {
                ObjectResult result = context.Result as ObjectResult;
                if (result != null)
                {
                    logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value);
                    logApiEntity.LogStatus     = OperateStatusEnum.Success.ParseToInt();
                }
            }

            logApiEntity.ExecuteParam  = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000);
            logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000);
            logApiEntity.ExecuteTime   = sw.ElapsedMilliseconds.ParseToInt();

            Action taskAction = async() =>
            {
                // 让底层不用获取HttpContext
                logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0;
                await new LogApiBLL().SaveForm(logApiEntity);
            };
            AsyncTaskHelper.StartTask(taskAction);
            #endregion
        }
        /// <summary>
        /// 异步接口日志
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            string       token = context.HttpContext.Request.Headers["ApiToken"].ParseToString();
            OperatorInfo user  = await Operator.Instance.Current(token);

            if (user != null)
            {
                // 根据传入的Token,设置CustomerId
                if (context.ActionArguments != null && context.ActionArguments.Count > 0)
                {
                    PropertyInfo property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("Token");
                    if (property != null)
                    {
                        property.SetValue(context.ActionArguments.FirstOrDefault().Value, token, null);
                    }
                    switch (context.HttpContext.Request.Method.ToUpper())
                    {
                    case "GET":
                        break;

                    case "POST":
                        property = context.ActionArguments.FirstOrDefault().Value.GetType().GetProperty("CustomerId");
                        if (property != null)
                        {
                            property.SetValue(context.ActionArguments.FirstOrDefault().Value, user.UserId, null);
                        }
                        break;
                    }
                }
            }
            var resultContext = await next();

            sw.Stop();

            #region 保存日志
            LogApiEntity logApiEntity = new LogApiEntity();
            logApiEntity.ExecuteUrl = context.HttpContext.Request.Path;
            logApiEntity.LogStatus  = OperateStatusEnum.Success.ParseToInt();

            #region 获取Post参数
            switch (context.HttpContext.Request.Method.ToUpper())
            {
            case "GET":
                logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                break;

            case "POST":
                if (context.ActionArguments?.Count > 0)
                {
                    logApiEntity.ExecuteUrl  += context.HttpContext.Request.QueryString.Value.ParseToString();
                    logApiEntity.ExecuteParam = TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000);
                }
                else
                {
                    logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                }
                break;
            }
            #endregion

            if (resultContext.Exception != null)
            {
                #region 异常获取
                StringBuilder sbException = new StringBuilder();
                Exception     exception   = resultContext.Exception;
                sbException.AppendLine(exception.Message);
                while (exception.InnerException != null)
                {
                    sbException.AppendLine(exception.InnerException.Message);
                    exception = exception.InnerException;
                }
                sbException.AppendLine(TextHelper.GetSubString(resultContext.Exception.StackTrace, 8000));
                #endregion

                logApiEntity.ExecuteResult = sbException.ToString();
                logApiEntity.LogStatus     = OperateStatusEnum.Fail.ParseToInt();
            }
            else
            {
                ObjectResult result = context.Result as ObjectResult;
                if (result != null)
                {
                    logApiEntity.ExecuteResult = JsonConvert.SerializeObject(result.Value);
                    logApiEntity.LogStatus     = OperateStatusEnum.Success.ParseToInt();
                }
            }
            if (user != null)
            {
                logApiEntity.BaseCreatorId = user.UserId;
            }
            logApiEntity.ExecuteParam  = TextHelper.GetSubString(logApiEntity.ExecuteParam, 4000);
            logApiEntity.ExecuteResult = TextHelper.GetSubString(logApiEntity.ExecuteResult, 4000);
            logApiEntity.ExecuteTime   = sw.ElapsedMilliseconds.ParseToInt();

            Action taskAction = async() =>
            {
                // 让底层不用获取HttpContext
                logApiEntity.BaseCreatorId = logApiEntity.BaseCreatorId ?? 0;

                await new LogApiBLL().SaveForm(logApiEntity);
            };
            AsyncTaskHelper.StartTask(taskAction);
            #endregion
        }
        /// <summary>
        ///     异步接口日志
        /// </summary>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            bool hasAllowAnonymous = context.ActionDescriptor.EndpointMetadata
                                     .Any(em => em.GetType() == typeof(AllowAnonymousAttribute)); //< -- Here it is

            if (hasAllowAnonymous)
            {
                await next();
            }
            else
            {
                // 类似计时器
                var sw = new Stopwatch();
                sw.Start();

                // 获取用户信息
                var user = await _operator.Current();

                if (user == null)
                {
                    throw new Exception("User not logged in.");
                }

                // 更新用户的权限到缓存中
                if (user.MenuAuthorizes == null || user.MenuAuthorizes.Count() == 0)
                {
                    var objMenuAuthorize = await _menuAuthorizeBLL.GetAuthorizeList(user);

                    user.MenuAuthorizes = objMenuAuthorize.Data;
                    _operator.UpdateOperatorInfo(user);
                }

                // 校验用户权限
                var obj = await CheckAccess(context, user);

                // 没有权限
                if (obj.Tag == 0)
                {
                    obj.Message    = "抱歉,您没有权限";
                    context.Result = new JsonResult(obj);
                    return;
                }

                // 执行
                var resultContext = await next();

                #region 保存日志

                // 如果配置了仅记录报错日志
                if (LogAllApi.ToUpper() == "ERROR" && resultContext.Exception == null)
                {
                    return;
                }

                var logApiEntity = new LogApiEntity();
                logApiEntity.ExecuteUrl = context.HttpContext.Request.Path;
                logApiEntity.LogStatus  = OperateStatusEnum.Success.ParseToInt();

                #region 获取Post参数

                switch (context.HttpContext.Request.Method.ToUpper())
                {
                case "GET":
                    logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                    break;

                case "POST":
                    if (context.ActionArguments?.Count > 0)
                    {
                        if (!context.HttpContext.Request.QueryString.HasValue)
                        {
                            break;
                        }

                        logApiEntity.ExecuteUrl  += context.HttpContext.Request.QueryString.Value.ParseToString();
                        logApiEntity.ExecuteParam =
                            TextHelper.GetSubString(JsonConvert.SerializeObject(context.ActionArguments), 4000);
                    }
                    else
                    {
                        logApiEntity.ExecuteParam = context.HttpContext.Request.QueryString.Value.ParseToString();
                    }

                    break;
                }

                #endregion

                if (user != null)
                {
                    logApiEntity.CreatorId = user.UserId;
                }

                // 异常信息
                SetExceptionMsg(resultContext, context, logApiEntity);

                // 计时器结束
                sw.Stop();

                logApiEntity.ExecuteTime = sw.ElapsedMilliseconds.ParseToInt();
                logApiEntity.IpAddress   = NetHelper.Ip;

                // 记录日志
                await SaveLogAPI(logApiEntity);

                #endregion
            }
        }
예제 #10
0
        public async Task <TData <string> > SaveFormJson([FromForm] LogApiEntity entity)
        {
            var obj = await _logApiBLL.SaveForm(entity);

            return(obj);
        }