如何隐藏 miniprofiler?

Posted

技术标签:

【中文标题】如何隐藏 miniprofiler?【英文标题】:How to hide miniprofiler? 【发布时间】:2011-09-29 23:49:37 【问题描述】:

我正在使用 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);

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

【问题讨论】:

尝试 1 在视图中结合上面的示例,应该可以正常工作。 【参考方案1】:

探查器的home page(请参阅“放弃探查器会话”部分)具有正在寻找的使用模式:

protected void Application_BeginRequest()

   MvcMiniProfiler.MiniProfiler.Start();  

protected void Application_AuthenticateRequest(Object sender, EventArgs e)

   if(!CurrentUserIsAllowedToSeeProfiler())
   
       MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
   

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


编辑

您还可以查看他们的Example Project,了解他们如何在特定情况下实现禁用它。他们的检查是查看您是否通过 localhost 访问它,但您当然可以将其更改为检查查询字符串。

基于此,“尝试#1”似乎应该是诀窍。请注意,“接近”和“尝试#1”之间的区别在于前者正在寻找查询字符串profiling,而您的尝试#1 正在检查showProfiler。会不会只是一个简单的查询字符串混淆?

【讨论】:

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

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

protected void Application_BeginRequest()

    MiniProfiler.Start();  

那么在你看来:

@if(!Request.QueryString.AllKeys.Contains("profiling"))

    MiniProfiler.Stop(true);

【讨论】:

如果您将该代码放入您拥有的每个控制器的每个操作中,这可能会变得非常难看。在这种情况下,也许通过全局 ActionFilter 或 Global.asax 的通用方法会更好? 如果你想避免重复检查,你可以把它放在BeginRequest事件中,或者在你的控制器中覆盖OnActionExecuting 除了显而易见的......在视图上调用 MiniProfiler.Stop() 而不是 Application_EndRequest 方法会有什么不同?如果没有,我没有得到我所尝试的和你的建议之间的区别,对不起。 你可以在任何地方做,真的。我提到了这个观点,因为这就是你在问题中提到的。最好在生命周期的早期停止以防止任何额外的开销,所以 BeginRequest 会很好。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于如何隐藏 miniprofiler?的主要内容,如果未能解决你的问题,请参考以下文章

Miniprofiler在目中使用报 mini-profiler-resources/includes.js 404错误

Miniprofiler在普通net项目中的使用

MiniProfiler

Miniprofiler 监控ef执行详解

使用 mvc mini profiler 的每个操作的阈值计时

使用MiniProfiler调试ASP.NET web api项目性能