2011-09-29 8 views
11

私は、MVC Miniプロファイラを使用してアプリケーションの特定の部分の速度をチェックしています。後で何かが起こった場合に備えてそれを保持したいと思います。それは完全なログセットではありませんが、ページを長くすることが何をしているかを知るにはかなり便利です。miniprofilerを隠すには?

私の目標は、リクエストを特定のパラメータで受け取った場合にのみ、プロファイルを非表示にしてプロファイルを作成することです。しかし、私の試みは、私が期待していた方法で働いたことはありません。

これは、画面(ビュー内のコード)の上に表示されないのトリックを行っている:

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

これは近いました試みです。ミニプロファイラーの情報は正しく表示されませんが、私が表示した時点では、表示を停止して以来、すべてプロファイルされています。だから、私のページをプロファイルして3秒かかるとしよう。私は、クエリのパラメータを削除し、ページを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

上記のサンプルをビューに組み合わせると、うまくいくはずです。 –

答えて

12

home pageプロファイラの(「プロファイラSessionセクションを放棄参照)が使用パターンを探していました:

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

あなたCurrentUserIsAllowedToSeeProfilerの実装では、クエリ文字列にキーが含まれているかどうかを確認し、プロファイラを起動します。


EDIT

あなたはまた、彼らは、特定の状況でそれを無効にする実装方法を確認するために彼らのExample Projectで見ることができます。彼らのチェックは、あなたがlocalhost経由でそれにアクセスしているかどうかを確認することですが、もちろんクエリ文字列をチェックするように変更できます。

それに基づいて、「試行#1」がトリックである必要があります。「近いです」と「試行#1」の違いは、前者がクエリ文字列profilingを探しているのに対して、試行#1はshowProfilerをチェックしていることです。それはちょうど単純なクエリ文字列ミックスアップでしたか?

+0

ありがとう!実際に、パラメータのスペルミスは投稿作成時の私の問題でしたが、文字列はプロジェクトで同じでした。あなたの答えは、私が前にチェックしなかった設定とそのサンプルプロジェクトを指摘しました...私はそれを試してみましょう。 – Alpha

+0

設定には何もしていませんでした。まさにあなたが言ったように、使用するパターンはあなたが提示したものでした。しかし、実際には 'Application_AuthenticateRequest'を実装する必要はありません。セッションをプロファイリングしたくない場合は、ミニプロファイラを起動し、停止(および結果を破棄)する非常に同じ 'Application_BeginRequest'メソッドの一部を使用しました。ありがとう! – Alpha

+0

@Alpha私は、参照として引用して以来、ソースから逐語的にコピーしたばかりで、開始リクエストでAuthenticateRequestを使用する理由はありません。 – vcsjones

0

begin requestイベントで通常のようにプロファイラを起動するだけです。次に、コントローラまたはビューでクエリ文字列をチェックし、MiniProfiler.Stop(true)を呼び出して、プロファイルデータが破棄されていないか破棄されている場合は破棄します。あなたのビューで次に

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

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

これは、あなたが持っているすべてのコントローラのすべてのアクションにそのコードを入れるとかなり醜いものになるかもしれません。この場合、Global ActionFilterまたはGlobal.asax経由の一般的なアプローチが望ましいでしょうか? –

+0

チェックを繰り返さないようにするには、 'BeginRequest'イベントに入れたり、コントローラの' OnActionExecuting'をオーバーライドしたりすることができます。 –

+0

明白な以外にも、 'Application_EndRequest'メソッドではなく、ビュー上でMiniProfiler.Stop()を呼び出す方法がどう違うのですか?そうでない場合は、私が試したものとあなたが提案したものとの間に違いはありませんでした。 – Alpha

関連する問題