2016-07-01 5 views
0

Ich möchte die Ausführungszeit von fast allen Aktionen in asp.net mvc5 protokollieren, aber im Grunde tun dies mit unten Code ist der richtige Weg oder macht es das Projekt sehr langsam? Irgendein Vorschlag?Wie berechnet man alle Action-Laufzeit in asp.net mvc5 mit benutzerdefinierten Aktion Filter?

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

dies scheint mir, ok, es wird auf jeden Fall nicht, Ihren Code langsamer. Sie könnten jedoch ein Problem mit der Verständigung haben. Ich bin nicht sicher, dass eine separate Filterinstanz für jede Anfrage erstellt wird. Wenn nicht, könnten Sie falsche Messungen haben, sobald mehrere Anfragen vorliegen. Möglicherweise müssen Sie die Timings in einem Wörterbuch oder im Kontext selbst speichern, um Nebenläufigkeitsprobleme zu vermeiden. – Jim

+0

@Jim Vielen Dank für Ihre Vorschläge, die Timings sollten im Wörterbuch vorhanden sein, um Nebenläufigkeitsprobleme zu vermeiden. – mayk

+0

Ich denke, es wird pro Anfrage verwendet, aber was passiert, wenn eine Ausnahme auftritt? – Legends

Antwort

2

Ich würde vielleicht das Timing in einem geeigneten Bereich speichern, vielleicht auf die Anfrage.

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

auf diese Weise Sie ein schwerfälliges Wörterbuch vermeiden verwenden und die Timer ist auf einer per request Basis.

Anschließend können Sie werfen den Wert in OnActionExecuted

 var sw = filterContext.HttpContext.Items["timer"] as Stopwatch; 
     sw.ElapsedMilliseconds... 
Verwandte Themen