C# 如何隐藏迷你探查器?

C# 如何隐藏迷你探查器?,c#,asp.net-mvc-3,profiling,mvc-mini-profiler,C#,Asp.net Mvc 3,Profiling,Mvc Mini Profiler,我正在使用MVC Mini profiler来检查我的应用程序的特定部分的速度,并希望将其保留在那里,以防以后发生什么事情,我可能需要检查“出了什么问题”。它不是一个完整的日志集,但它非常方便,可以知道是什么让页面花费很长时间 因此,我的目标是隐藏它,并且仅当请求带有特定参数时才对其进行配置。然而,我的任何尝试都没有达到我预期的效果 这就完成了不在屏幕上显示的技巧(视图中的代码): 这是一次更接近的尝试。正确地隐藏了mini profiler信息,但在我显示它的那一刻,它对我停止显示后的所有内容

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

因此,我的目标是隐藏它,并且仅当请求带有特定参数时才对其进行配置。然而,我的任何尝试都没有达到我预期的效果

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

这是一次更接近的尝试。正确地隐藏了mini profiler信息,但在我显示它的那一刻,它对我停止显示后的所有内容进行了分析。所以,假设我评测了我的页面,它需要3秒钟。我删除了查询参数并再次加载页面三次。我再次添加我的参数,我看到4组配置文件信息。这意味着它可以跟踪所有东西,我想知道它是否会导致内存问题

试图让这种情况不再发生:

尝试1:

protected void Application_BeginRequest()
{
    if (Request.QueryString.AllKeys.Contains("showProfiler"))
    {
        MiniProfiler.Start();
    }
}
protected void Application_EndRequest()
{
    MiniProfiler.Stop(!Request.QueryString.AllKeys.Contains("showProfiler"));
}
protected void Application_EndRequest()
{
    MiniProfiler.Stop(true);
}
尝试2:

protected void Application_BeginRequest()
{
    if (Request.QueryString.AllKeys.Contains("showProfiler"))
    {
        MiniProfiler.Start();
    }
}
protected void Application_EndRequest()
{
    MiniProfiler.Stop(!Request.QueryString.AllKeys.Contains("showProfiler"));
}
protected void Application_EndRequest()
{
    MiniProfiler.Stop(true);
}
尝试3:

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

这些都不起作用。有什么想法吗?

只需像启动begin请求事件中的正常情况一样启动探查器。然后在您的控制器或视图中,检查查询字符串并调用
MiniProfiler.Stop(true)
以丢弃已分析的数据(如果没有或设置为false)

protected void Application_BeginRequest()
{
    MiniProfiler.Start();  
}
那么在你看来,

@if(!Request.QueryString.AllKeys.Contains("profiling"))
{
    MiniProfiler.Stop(true);
}
探查器的(请参阅“放弃探查器会话”一节)具有您正在寻找的使用模式:

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”之间的区别“是前者正在查找查询字符串
评测
,而您的尝试#1正在检查
showProfiler
。这可能只是一个简单的查询字符串混淆吗?

我在上面没有找到解决方案

对我来说,唯一的解决方案是在Web.Config文件中设置debug=“false”

<compilation defaultLanguage="c#" debug="false" batch="false" targetFramework="4.5.2">


希望这对其他人也有帮助。

如果你在你拥有的每个控制器的每个动作中都使用这些代码,这可能会变得非常糟糕。在这种情况下,也许通过全局ActionFilter或global.asax的常规方法更可取?如果您想避免重复检查,可以将其放入
BeginRequest
事件中,或覆盖控制器中的
OnActionExecuting
。除了明显的。。。调用视图上的MiniProfiler.Stop()而不是
应用程序的EndRequest
方法会有多大的不同?如果没有,我也不知道我尝试的和你建议的有什么区别,对不起。你可以在任何地方做,真的。我提到了这个观点,因为这就是你在问题中提到的。最好在生命周期的早期停止,以防止任何额外的开销,因此BeginRequest将是好的。谢谢!事实上,在创建帖子时,参数上的拼写错误是我的问题,但是项目中的字符串是相同的。您的回答指向设置(我以前没有检查过)和示例项目。。。我会尝试一下,然后再给你回复。设置没有任何作用,正如你所说的,要使用的模式就是你展示的模式。但是,实际上不需要实现
应用程序\u AuthenticateRequest
。我使用了完全相同的
应用程序\u BeginRequest
方法的一部分,如果我不想评测会话,则启动miniprofiler并停止(并丢弃结果)。谢谢@Alpha我同意,没有理由在begin请求上使用AuthenticateRequest-我只是从源代码中逐字复制了它,因为我引用它作为参考。尝试1与上面视图中的示例相结合,应该可以正常工作。