Action执行时间过滤器

public class AccessStatisticsAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// log4net 日志
        /// </summary>
        private static readonly ILog Logger = LogManager.GetLogger(typeof(AccessStatisticsAttribute));

        /// <summary>
        /// 该Action对应的权限项名称
        /// </summary>
        private readonly string _actionName;

        /// <summary>
        /// 该Action对应的权限项名称
        /// </summary>
        private readonly bool _logResult;

        /// <summary>
        /// .ctor
        /// </summary>
        public AccessStatisticsAttribute(string actionName, bool logTheResult = false)
        {
            this._actionName = actionName;
            this._logResult = logTheResult;
        }

        /// <summary>
        /// 提供一个入口点用于进行自定义授权检查
        /// </summary>
        /// <param name="filterContext">HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。</param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            GetSessionTimer(filterContext).Start();
            base.OnActionExecuting(filterContext);
        }

        /// <summary>
        /// OnActionExecuted
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var stopwatch = GetSessionTimer(filterContext);
            stopwatch.Stop();
            var result = this._logResult ? filterContext.Result.ToJsonNoneFormat() : string.Empty;

            if (stopwatch.Elapsed.TotalMilliseconds > ActionHelper.ElapsedMillisecondsLimit)
            {
                Logger.InfoFormat("OUT : {0} {1} {2}ms {3}s", _actionName, result, (uint)stopwatch.Elapsed.TotalMilliseconds, (uint)stopwatch.Elapsed.TotalSeconds);
            }

            base.OnActionExecuted(filterContext);
        }

        
        private Stopwatch GetSessionTimer(ControllerContext context, string name = "actionElapse")
        {
            string key = name + "timer";
            if (context.HttpContext.Items.Contains(key))
            {
                return (Stopwatch)context.HttpContext.Items[key];
            }

            var result = new Stopwatch();
            context.HttpContext.Items[key] = result;
            return result;
        }
    }

 

posted @ 2018-02-04 18:44  zslm___  阅读(381)  评论(0编辑  收藏  举报