2009-12-01 12 views
15

मैं ट्रैक करने के लिए एक तरीका ढूंढ रहा हूं कि सर्वर द्वारा उत्पन्न होने वाले पृष्ठ के लिए कितना समय लगेगा। मुझे पता है कि मैं इसे ट्रैक करने के लिए ट्रेस का उपयोग कर सकता हूं लेकिन मुझे प्रति पृष्ठ प्रदर्शित करने का एक तरीका चाहिए।पेज पीढ़ी का समय - एएसपी.नेट एमवीसी

इसके ASP.Net MVC 2

उत्तर

14

हाँ Derin सुझाव की तरह masterpage में रख एक ASP.NEt आवेदन में यह करने के लिए मानक तरीका है, मैं सिर्फ एक जोड़ने यदि ऐसा है तो यह गैर- HTML प्रतिक्रियाओं के साथ हस्तक्षेप नहीं करता है सुझाव है: संपादित करें: पूर्ण कार्यान्वयन जोड़ा गया आयन

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 */ } 
} 

आप भी इसे करने के लिए कुछ शैली जोड़ सकते हैं ...

और अंदर httpModules धारा WebConfig में अपने माड्यूल पंजीकृत होने याद रखें:

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

के संपूर्ण संदर्भ के इस बारे में जाँच स्टीवन सैंडर्सन द्वारा प्रो एएसपी.नेट एमवीसी फ्रेमवर्क - अध्याय 15 - प्रदर्शन, निगरानी पृष्ठ जनरेशन टाइम्स।

संपादित करें: (टिप्पणी @Pino) ​​ यहाँ मेरी परियोजना के लिए उदाहरण है:? alt text http://www.diarioplus.com/files/pictures/example_performance.JPG

+0

धन्यवाद - यह अच्छी तरह से काम करता है सिवाय इसके कि यह तत्व के बाद आउटपुट प्रतीत होता है जो मेरे पृष्ठ को तोड़ता है :(सुझाव? – LiamB

+0

यह प्रतिक्रिया के हिस्से के रूप में जोड़ा गया है (संलग्न), यह HTML बंद टैग के बाद नहीं हो सकता है। – JOBG

+0

मैं अपनी पोस्ट संपादित करता हूं नमूना आईएमजी के साथ, मेरे पास पहले से ही एक प्रोजेक्ट चल रहा है और इसका परीक्षण है, मुझे नहीं पता कि डारिन ने एचटीएमएल के बाद क्यों कहा ..?, शायद उसने एक और कार्यान्वयन को संदर्भित किया। – JOBG

4

यह जहां आपको यह जानकारी शामिल करना चाहते हैं पर निर्भर करेगा। उदाहरण के लिए आप एक http हैंडलर कि </html> टैग के बाद समय प्रस्तुत करना प्रदर्शित करेगा लिख ​​सकते हैं:

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() 
    { 
    } 
} 

आप तो html पृष्ठ के बीच में कहीं समय प्रस्तुत करना प्रदर्शित करने के लिए चाहते हैं, तो इस समय के लिए खाते में नहीं होंगे प्रस्तुत करना कुल पृष्ठ समय प्रस्तुत करें।

+0

यह तत्व है जो मेरा पेज टूट जाता है के बाद उत्पादन करने लगता सुझाव – LiamB

+0

हाँ, वह है :(क्या मैं में कहा मेरी पोस्ट करें। अगर आप अपना सत्यापन तोड़ना नहीं चाहते हैं तो आप इसे एक टिप्पणी में डाल सकते हैं। –

+0

क्या यह दृष्टिकोण जेसन और फाइल के नतीजे या सिर्फ एचटीएमएल के साथ काम करेगा? –

15

आप एक 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; 
    } 
} 

डेकोरेट हर नियंत्रक या इसके साथ कार्रवाई विधि और देखा की तरह इसे लागू कर सकते हैं, यह बहिष्कार डिबग में पाठ थूक।

संपादित करें: यदि आप OnActionExecuted विधि को यह टुकड़ा जोड़ सकता है आप इसे पृष्ठ पर मुद्रित करने के लिए चाहते हैं

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 
} 
अब आप executiontime ViewData में बचाया है और पेज में उस तक पहुँच सकते

.. मैं आमतौर पर इस

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

प्रत्येक नियंत्रक को सजाने या एक्शन-विधि दर्द का थोड़ा सा है बहुत कुछ है (बहुत बड़ी परियोजना) - वैसे भी हम इस तरह के बड़े बदलाव किए बिना इस काम को व्यापक बना सकते हैं? – LiamB

+3

मेरे अनुमान में मेरे सभी नियंत्रक बेसकंट्रोलर से विरासत में हैं । तो मैं सिर्फ बेसकंट्रोलर को सजाने के लिए तैयार करता हूं, जो बदले में सभी क्रिया-विधियों को "सजाने" देता है। –

+2

इसकी सुंदर अच्छी दृष्टिकोण, यह उल्लेखनीय है कि यह वास्तव में नियंत्रक जीवन काल को ट्रैक करता है, न कि कुल अनुरोध जीवनकाल। – JOBG

संबंधित मुद्दे