Action执行时间过滤器

Posted zslm___

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
        }
    }

 

以上是关于Action执行时间过滤器的主要内容,如果未能解决你的问题,请参考以下文章

action

java web 过滤器跟拦截器的区别和使用

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java中的过滤器和拦截器

过滤器

浅谈Struts2拦截器的原理与实现