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.
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.