2016-07-01 4 views
0

asp.net mvc5のほとんどすべてのアクションの実行時間を記録しますが、基本的にこれを下のコードで行うのは正しい方法ですか?それともプロジェクトが非常に遅くなりますか?なにか提案を?カスタムアクションフィルタを使用してasp.net mvc5のすべてのアクション実行時間を計算するには?

Stopwatch sw = new Stopwatch(); 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     sw.Start(); 
     base.OnActionExecuting(filterContext); 
    } 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     sw.Stop(); 
     float f = sw.ElapsedMilliseconds; 
     base.OnActionExecuted(filterContext); 
    } 
+1

に値をキャストすることができ、それは間違いなくあなたのコードが遅くすることはありません。あなたはconcurencyの問題があるかもしれません。個別のフィルタインスタンスが各リクエストに対して作成されているかどうかはわかりません。そうでなければ、複数のリクエストがあった場合、正しく測定できない可能性があります。並行処理の問題を避けるために、タイミングを辞書またはコンテキスト自体に保存する必要があります。 – Jim

+0

@Jim同時実行性の問題を避けるために、タイミングが辞書になければならないというあなたの主張に感謝します。 – mayk

+0

リクエストごとに使用されていると思いますが、例外が発生した場合はどうなりますか? – Legends

答えて

2

おそらく要求に応じて、適切なスコープのある場所にタイミングを保存しています。あなたが面倒な辞書を使用しないような方法、そしてあなたのタイマーがper request基づいている

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    filterContext.HttpContext.Items["timer"] = Stopwatch.StartNew(); 
    base.OnActionExecuting(filterContext); 
} 

あなたは、これは私にはOKに見えるOnActionExecuted

 var sw = filterContext.HttpContext.Items["timer"] as Stopwatch; 
     sw.ElapsedMilliseconds... 
関連する問題