使用MVC Miniprofiler进行每个动作调用

Dan*_*Dan 14 asp.net-mvc mvc-mini-profiler

我一直在试验这个伟大的工具,Mvc MiniProfiler.

我不希望用大量Step命令乱丢我的所有视图,所以我想在每个动作调用中使用探查器.馊主意?这是我到目前为止所尝试的:

 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);
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

但我认为这不是我想做的事情吗?我想我需要启动分析器OnActionExecuting并将其停止OnResultExecuted.考虑到探查器旨在与using声明一起使用,我该如何做到这一点.

Dar*_*rov 24

您可以定义全局操作过滤器:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并注册Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new ProfileActionsAttribute());
}
Run Code Online (Sandbox Code Playgroud)

这就是全部.