Search code examples
asp.net-mvcmvc-mini-profiler

Using MVC Miniprofiler for every action call


Iv been experimenting the great tool, Mvc MiniProfiler.

I don't want to litter all my view with lots of Step commands, so I am wanting to use the profiler with every action call. Bad idea? This is what I have tried so far:

 public abstract class BaseController : Controller
 {
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var profiler = MiniProfiler.Current;
            using (profiler.Step("Action: "+filterContext.ActionDescriptor.ActionName))
            {
                base.OnActionExecuting(filterContext);
            }
        }
}

But I don't think this is doing what I am intending? I think I need to start the profiler on OnActionExecuting and stop it on OnResultExecuted. How do I do this, considering the profiler is designed to be used with the using statement.


Solution

  • You could define a global action filter:

    public class ProfileActionsAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var profiler = MiniProfiler.Current;
            var step = profiler.Step("Action: " + filterContext.ActionDescriptor.ActionName);
            filterContext.HttpContext.Items["step"] = step;
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var step = filterContext.HttpContext.Items["step"] as IDisposable;
            if (step != null)
            {
                step.Dispose();
            }
        }
    }
    

    and register in Global.asax:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new ProfileActionsAttribute());
    }
    

    and that's pretty much all.