问题 如何隐藏miniprofiler?


我正在使用MVC Mini分析器来检查我的应用程序的特定部分的速度,并希望将其保留在那里以防万一发生以后的事情,我可能需要检查“出了什么问题”。它不是一个完整的日志集,但它非常方便地知道什么使页面花了很长时间。

因此,我的目标是隐藏它并仅在请求带有特定参数时才对其进行配置。但是,我的尝试都没有像我期望的那样奏效。

这已经完成了不在屏幕上显示它的技巧(视图中的代码):

@if (Request.QueryString.AllKeys.Contains("showProfiler"))
{ 
    @MvcMiniProfiler.MiniProfiler.RenderIncludes()
}

这是接近的尝试。正确地隐藏迷你探查器信息,但是在我显示它的那一刻,它描述了自我停止显示它以来的所有内容。所以,假设我描述了我的页面,需要3秒钟。我删除了查询参数并再次加载页面三次。我再次添加我的参数,我看到4组配置文件信息。这意味着它会记录所有内容,我想知道它是否会给内存带来问题。

尝试不再发生这种情况:

尝试1:

protected void Application_BeginRequest()
{
    if (Request.QueryString.AllKeys.Contains("showProfiler"))
    {
        MiniProfiler.Start();
    }
}

尝试2:

protected void Application_EndRequest()
{
    MiniProfiler.Stop(!Request.QueryString.AllKeys.Contains("showProfiler"));
}

尝试3:

protected void Application_EndRequest()
{
    MiniProfiler.Stop(true);
}

这些都没有奏效。有任何想法吗?


3093
2017-09-29 23:49


起源

尝试1与视图上方的示例相结合,应该可以正常工作。 - Sam Saffron


答案:


主页 (请参阅剖析器的“放弃Profiler会话”部分),其使用模式正在寻找:

protected void Application_BeginRequest()
{
   MvcMiniProfiler.MiniProfiler.Start();  
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
   if(!CurrentUserIsAllowedToSeeProfiler())
   {
       MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
   }
}

你的实施 CurrentUserIsAllowedToSeeProfiler 将检查查询字符串是否包含触发分析器的键。


编辑

你也可以看看他们的 示例项目 看看他们在某些情况下如何实现禁用它。他们的检查是看你是否通过localhost访问它,但你当然可以改变它来检查查询字符串。

基于此,似乎“尝试#1”应该是诀窍。请注意,“关闭”和“尝试#1”之间的区别是前者正在查找查询字符串 profiling,而你的尝试#1正在检查 showProfiler。它可能只是一个简单的查询字符串混合?


13
2017-09-29 23:56



谢谢!事实上,在创建帖子时,参数的拼写错误是我的问题,但是项目中的字符串是相同的。你的答案指向我的设置(我以前没有检查过)和那个示例项目......我会尝试一些并回复你。 - Alpha
设置没有任何关系,正如您所说,使用的模式就是您提供的模式。但是,没有必要实施 Application_AuthenticateRequest。我使用了同样的部分内容 Application_BeginRequest 方法,启动miniprofiler并停止(并丢弃结果),如果我不想分析会话。谢谢! - Alpha
@Alpha我同意,没有理由使用AuthenticateRequest而不是开始请求 - 我只是从源文件中逐字复制它,因为我引用它作为参考。 - vcsjones


只需在开始请求事件中启动探查器即可。然后在您的控制器或视图中,检查查询字符串并调用 MiniProfiler.Stop(true) 丢弃配置文件数据(如果未设置或设置为false)。

protected void Application_BeginRequest()
{
    MiniProfiler.Start();  
}

然后在你看来:

@if(!Request.QueryString.AllKeys.Contains("profiling"))
{
    MiniProfiler.Stop(true);
}

0
2017-09-29 23:54



如果将该代码放在每个控制器的每个动作中,这可能会变得非常难看。在这种情况下,通过全局ActionFilter或Global.asax的一般方法可能更好吗? - Maxim Zaslavsky
如果你想避免重复检查,你可以把它放在 BeginRequest 事件或覆盖 OnActionExecuting 在你的控制器中。 - Kyle Trauberman
除了显而易见的......在视图上调用MiniProfiler.Stop()有多么不同而不是 Application_EndRequest 方法?如果没有,我没有区分我尝试的和你的建议,对不起。 - Alpha
你可以在任何地方做到,真的。我提到了这个观点,因为这就是你在问题中提到的。最好在生命周期的早期停止以防止任何额外开销,因此BeginRequest会很好。 - Kyle Trauberman