2011-06-28 12 views
13

के लिए एमवीसी मिनीप्रोफाइलर का उपयोग करना Iv महान उपकरण का प्रयोग कर रहा है, एमवीसी MiniProfilerप्रत्येक एक्शन कॉल

मैं अपने सभी दृश्य को Step कमांड के साथ कूड़े नहीं करना चाहता, इसलिए मैं प्रत्येक एक्शन कॉल के साथ प्रोफाइलर का उपयोग करना चाहता हूं। बुरा विचार? मैंने अभी तक यह कोशिश की है:

public abstract class BaseController : Controller 
{ 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var profiler = MiniProfiler.Current; 
      using (profiler.Step("Action: "+filterContext.ActionDescriptor.ActionName)) 
      { 
       base.OnActionExecuting(filterContext); 
      } 
     } 
} 

लेकिन मुझे नहीं लगता कि यह वही कर रहा है जो मैं चाहता हूं? मुझे लगता है कि मुझे OnActionExecuting पर प्रोफाइलर शुरू करने की आवश्यकता है और इसे OnResultExecuted पर रोकें। मैं यह कैसे कर सकता हूं, प्रोफाइलर को using कथन के साथ उपयोग करने के लिए डिज़ाइन किया गया है।

+1

यदि आप मिनी प्रोफाइलर का स्रोत डाउनलोड करते हैं तो नमूना प्रोजेक्ट में बेस कंट्रोलर क्लास है जो वास्तव में ऐसा करता है। –

उत्तर

24

आप एक वैश्विक कार्रवाई फिल्टर निर्धारित कर सकते हैं:

public class ProfileActionsAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var profiler = MiniProfiler.Current; 
     var step = profiler.Step("Action: " + filterContext.ActionDescriptor.ActionName); 
     filterContext.HttpContext.Items["step"] = step; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var step = filterContext.HttpContext.Items["step"] as IDisposable; 
     if (step != null) 
     { 
      step.Dispose(); 
     } 
    } 
} 

और Global.asax में रजिस्टर:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new ProfileActionsAttribute()); 
} 

और कहा कि काफी बस।

+0

डारिन एमवीसी 2 के लिए एक समकक्ष विधि है? –

+1

हां वास्तव में मुझे बस [baseActions] को अपने बेसकंट्रोलर में जोड़ना पड़ा, जो कि आसान था। –

+0

यदि आप जानना चाहते हैं कि कौन से ** नियंत्रक और कार्य ** निष्पादित किए गए हैं तो 'var step = profiler.Step ("नियंत्रक:" + filterContext.RouteData.Values ​​["नियंत्रक"] का उपयोग करें। ToString() + "Action:" + filterContext.ActionDescriptor.ActionName); ', आशा किसी की मदद करता है। – stom

2

एक्शनफ़िल्टर सोचने और उपयोग करने के लिए ठीक है। लेकिन एमवीसी अभी भी एक एएसपी .NET अनुप्रयोग है। प्रत्येक अनुरोध की शुरुआत और समाप्ति पर मिनीप्रोफाइलर को शुरू और बंद करने के लिए, आप Global.asax.cs फ़ाइल में एप्लिकेशन ईवेंट आज़मा सकते हैं।

// -------------------------------------------------------------------------------------------------------------------- 
// <copyright file="Global.asax.cs" company="Believe2014"> 
// http://believeblog.azurewebsites.net/post/miniprofiler--log4net 
// </copyright> 
// <summary> 
// The mvc application. 
// </summary> 
// -------------------------------------------------------------------------------------------------------------------- 

using System; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 

namespace Mvc4Application 
{ 
// Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    /// <summary> 
    ///  The mvc application. 
    /// </summary> 
    public class MvcApplication : HttpApplication 
    { 
     /// <summary> 
     ///  The application_ start. 
     /// </summary> 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 

      Profiler.Initialize(); 
     } 

     /// <summary> 
     /// The event when the application acquires request state. 
     /// </summary> 
     /// <param name="sender"> 
     /// The sender. 
     /// </param> 
     /// <param name="e"> 
     /// The event argument.. 
     /// </param> 
     protected void Application_AcquireRequestState(object sender, EventArgs e) 
     { 
      Profiler.Start(HttpContext.Current); 
     } 

     /// <summary> 
     /// This function is called by ASP .NET at the end of every http request. 
     /// </summary> 
     /// <param name="sender"> 
     /// The sender. 
     /// </param> 
     /// <param name="e"> 
     /// The event argument. 
     /// </param> 
     protected void Application_EndRequest(object sender, EventArgs e) 
     { 
      Profiler.Stop(); 
     } 
    } 
} 
+0

मैंने अपरिवर्तित किया क्योंकि Application_AququireRequestState मेरे लिए यह जांचने के लिए एक अच्छी जगह बन गया है कि उपयोगकर्ता का प्रमाणीकृत है और प्रोफ़ाइल का उपयोग करने/देखने के लिए उपयोग है, लेकिन यह ओपी के प्रश्न को सख्ती से हल नहीं करता है। इस बार अनुरोध, विशेष रूप से कार्रवाई नहीं। मामूली जानकारी, लेकिन महत्वपूर्ण हो सकता है। – DaveD

+0

वहां कई टूल हैं जो प्रसंस्करण समय अनुरोधों को ट्रैक कर सकते हैं। लेकिन यह विधि प्रमाणीकृत अनुरोधों के लिए प्रसंस्करण समय को ट्रैक करने के लिए विशेष है। यह प्रत्येक उपयोगकर्ता और उनके प्रतीक्षा समय के बारे में कहानी बताता है, न केवल सामान्य अनुरोध। – Believe2014

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