2009-12-01 33 views
15

Sunucu tarafından bir sayfanın oluşturulmasının ne kadar sürdüğünü izlemek için bir yol arıyorum. Bunu izlemek için Trace'ı kullanabileceğimi biliyorum, ancak bunu sayfa başına görüntülemenin bir yoluna ihtiyacım var.Sayfa oluşturma süresi - ASP.Net MVC

Onun ASP.Net MVC Size bu bilgiyi eklemek istediğiniz yere bağlıdır 2

cevap

14

Yep Derin Öneri gibi masterpage koymak: EDIT: tamamlanmış implementat eklendi iyon

public class PerformanceMonitorModule : IHttpModule 
{ 

    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += delegate(object sender, EventArgs e) 
     { 
      //Set Page Timer Star 
      HttpContext requestContext = ((HttpApplication)sender).Context; 
      Stopwatch timer = new Stopwatch(); 
      requestContext.Items["Timer"] = timer; 
      timer.Start(); 
      }; 
     context.PostRequestHandlerExecute += delegate(object sender, EventArgs e) 
     { 

      HttpContext httpContext = ((HttpApplication)sender).Context; 
      HttpResponse response = httpContext.Response; 
      Stopwatch timer = (Stopwatch)httpContext.Items["Timer"]; 
      timer.Stop(); 

      // Don't interfere with non-HTML responses 
      if (response.ContentType == "text/html") 
      { 
       double seconds = (double)timer.ElapsedTicks/Stopwatch.Frequency; 
       string result_time = string.Format("{0:F4} sec ", seconds); 
       RenderQueriesToResponse(response,result_time); 
      } 
     }; 
    } 
    void RenderQueriesToResponse(HttpResponse response, string result_time) 
    { 
     response.Write("<div style=\"margin: 5px; background-color: #FFFF00\""); 
     response.Write(string.Format("<b>Page Generated in "+ result_time)); 
     response.Write("</div>"); 
    } 
    public void Dispose() { /* Not needed */ } 
} 
da buna biraz stil ekleyebilir

...

Ve Kısım httpModules içeride WebConfig daki Modülü kayıt unutmayın:

<add name="Name" type="namespace, dll"/> 

Komple Referans Için bu konuda kontrol Pro ASP.NET MVC Framework, Steven Sanderson - Bölüm 15 - Performans, İzleme Sayfa Oluşturma Süreleri.

DÜZENLEME: (@Pino açıklama) İşte benim proje için örnektir:? Bu benim sayfası keser eleman SONRA çıkışa görünüyor alt text http://www.diarioplus.com/files/pictures/example_performance.JPG

+0

Teşekkürler - iyi çalışıyor dışında Bu, sayfamı bozan öğesinden sonra çıktı gibi görünüyor :(propos? – LiamB

+0

Bu, yanıtın bir parçası olarak eklenir (append), HTML kapanış etiketinden sonra olmayabilir – JOBG

+0

Gönderiyi düzenlerim bir örnek img ile, zaten çalışan bir proje var ve bunu test ediyorum, neden Darin HTML'den sonra onunla ilgili olduğunu bilmiyorum ..?, belki başka bir uygulamaya atıfta bulundu. – JOBG

4

. Örneğin </html> etiketinden sonra render süresini gösterecektir bir http işleyicisi yazabilirsiniz:

public class RenderTimeModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += (sender, e) => 
     { 
      var watch = new Stopwatch(); 
      var app = (HttpApplication)sender; 
      app.Context.Items["Stopwatch"] = watch; 
      watch.Start(); 
     }; 

     context.EndRequest += (sender, e) => 
     { 
      var app = (HttpApplication)sender; 
      var watch = (Stopwatch)app.Context.Items["Stopwatch"]; 
      watch.Stop(); 
      var ts = watch.Elapsed; 
      string elapsedTime = String.Format("{0} ms", ts.TotalMilliseconds); 
      app.Context.Response.Write(elapsedTime); 
     }; 
    } 

    public void Dispose() 
    { 
    } 
} 

Eğer HTML sayfasının ortasında bir yerde vakit kılmak görüntülemek istiyorsanız bu hesaba olmayacak görüntülenme süresi toplam sayfa oluşturma süresi.

+0

Evet, bu öneri – LiamB

+0

var :(ben söylediklerini benim Doğrulamayı bozmak istemezseniz bir yorumda bulunabilirsiniz –

+0

Bu yaklaşım Json ve Dosya sonuçlarıyla mı çalışacak yoksa sadece html mi? –

15

Bir ActionFilterAttribute

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class LoggingAttribute : ActionFilterAttribute 
{ 
    private readonly Stopwatch _sw; 

    public LoggingAttribute() 
    { 
     _sw = new Stopwatch(); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _sw.Start(); 
     Debug.WriteLine("Beginning executing: " + GetControllerAndActionName(filterContext.ActionDescriptor)); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     _sw.Stop(); 
     var ms = _sw.ElapsedMilliseconds; 

     Debug.WriteLine("Finishing executing: " + GetControllerAndActionName(filterContext.ActionDescriptor)); 
     Debug.WriteLine("Time elapsed: "+ TimeSpan.FromMilliseconds(ms).TotalSeconds); 
    } 

    private string GetControllerAndActionName(ActionDescriptor actionDescriptor) 
    { 
     return actionDescriptor.ControllerDescriptor.ControllerName + " - " + actionDescriptor.ActionName; 
    } 
} 

Süsleme her kontrolör ya da onunla aksiyon yöntem ve işte gibi bunu uygulayabilirsiniz, bu Outs debug metni tükürür.

DÜZENLEME: Sayfada yazdırmak istiyorsanız OnActionExecuted yönteme Bu ön bilgi eklemek olabilir

Şimdi executiontime ViewData kaydettiğiniz ve sayfaya erişebileceği
if(filterContext.Result is ViewResult) { //Make sure the request is a ViewResult, ie. a page 
    ((ViewResult) filterContext.Result).ViewData["ExecutionTime"] = ms; //Set the viewdata dictionary 
} 

.. genelde ben ben bu yüzden HTML olmayan yanıtları müdahale etmezse bir eklemenizi tavsiye sadece ediyorum, bir ASP.NEt uygulamada bunu yapmak için standart yoldur bu

<!-- The page took <%= ViewData["ExecutionTime"] %> ms to execute --> 
+0

Her denetleyiciyi süsle veya aksiyon-metodu biraz ağrıyor çok fazla (oldukça büyük proje) var - bu iş sahasını bu kadar büyük bir değişiklik yapmadan yapabilir miyiz? – LiamB

+3

Benim projemde tüm denetleyicilerim bir BaseController'den miras alıyor . Bu yüzden, sadece çalıştırılan tüm eylem yöntemlerini "süsleyen" taban denetleyicisini süslüyorum. –

+2

Oldukça iyi bir yaklaşım, sadece bu aslında Denetleyici yaşam süresi, ve toplam İstek ömrü süresini takip etmekten bahsetmeye değer. – JOBG