2011-09-29 96 views
11

我正在使用MVC Mini profiler來檢查我的應用程序的特定部分的速度,並希望將它保留在那裏以防萬一以後發生,並且我可能需要檢查「發生了什麼問題」。這不是一個完整的日誌集,但它很方便地知道什麼使頁面花費很長時間。如何隱藏miniprofiler?

因此,我的目標是隱藏它,並只有在請求帶有特定參數時才具有該配置文件。但是,我的嘗試都沒有以我期望的方式工作。

這樣做不顯示在屏幕上(在視圖代碼)的絕招:

@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); 
} 

這些都沒有工作。有任何想法嗎?

+0

嘗試1結合上面的示例在視圖中,應該工作得很好。 –

回答

12

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。難道它只是一個簡單的查詢字符串混合?

+0

謝謝!實際上,參數上的拼寫錯誤是我創建帖子時的問題,但字符串在項目中是相同的。你的回答指向我的設置(我以前沒有檢查過)和那個示例項目......我會嘗試一些並回復你。 – Alpha

+0

設置完全沒有任何要做的事情,就像您所說的那樣,要使用的模式就是您提供的模式。但是,並不需要實現'Application_AuthenticateRequest'。我使用了同樣的Application_BeginRequest方法的一部分,啓動miniprofiler並停止(並放棄結果),如果我不想分析會話。謝謝! – Alpha

+0

@Alpha我同意,沒有理由在開始請求時使用AuthenticateRequest - 我只是從源代碼逐字拷貝它,因爲我引用它作爲參考。 – vcsjones

0

只需在開始請求事件中像正常一樣啓動分析器即可。然後在您的控制器或視圖中,檢查查詢字符串,如果不存在或設置爲false,則調用MiniProfiler.Stop(true)以放棄配置文件數據。

protected void Application_BeginRequest() 
{ 
    MiniProfiler.Start(); 
} 
在你看來

然後:

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

如果您將該代碼放入您擁有的每個控制器的每個操作中,這可能會變得非常難看。在這種情況下,可能通過全局ActionFilter或通過Global.asax的一般方法更可取? –

+0

如果你想避免重複檢查,你可以把它放在'BeginRequest'事件中,或者在控制器中覆蓋'OnActionExecuting'。 –

+0

除了顯而易見的...在視圖上調用MiniProfiler.Stop()而不是在Application_EndRequest方法上有多不同?如果沒有,我沒有得到我嘗試和你的建議之間的區別,對不起。 – Alpha