2011-06-28 15 views
13

He estado experimentando la gran herramienta, Mvc MiniProfiler.Usando MVC Miniprofiler para cada llamada de acción

No quiero ensuciar toda mi vista con muchos comandos Step, así que quiero usar el generador de perfiles con cada llamada de acción. ¿Mala idea? Esto es lo que he intentado hasta ahora:

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); 
      } 
     } 
} 

¿Pero no creo que esto esté haciendo lo que intento? Creo que necesito iniciar el generador de perfiles en OnActionExecuting y detenerlo en OnResultExecuted. ¿Cómo hago esto, teniendo en cuenta que el generador de perfiles está diseñado para ser utilizado con la declaración using?

+1

Si descarga la fuente de Mini Profiler hay una clase de controlador base en el proyecto de muestra que hace exactamente esto. –

Respuesta

24

se podría definir un filtro de acción global:

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

y registrar en Global.asax:

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

y eso es más o menos todo.

+0

Darin ¿hay un método equivalente para MVC 2? –

+1

Hah en realidad solo tenía que agregar [ProfileActions] a mi BaseController, eso fue fácil. –

+0

si quiere saber qué ** Controlador y Acción ** ejecutaron entonces use 'var step = profiler.Step (" Controller: "+ filterContext.RouteData.Values ​​[" controller "]. ToString() +" Action: "+ filterContext.ActionDescriptor.ActionName); ', la esperanza ayuda a alguien. – stom

2

Está bien pensar y usar ActionFilter. Pero MVC sigue siendo una aplicación ASP .NET. Para iniciar y detener MiniProfiler al principio y al final de cada solicitud, puede probar los eventos de la aplicación en el archivo 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

Subí porque Application_AcquireRequestState terminó siendo un buen lugar para comprobar si el usuario está autenticado y tiene acceso para usar/ver el generador de perfiles, pero esto no resuelve estrictamente la pregunta del OP. Esto multiplica la solicitud, no la acción específicamente. Detalles menores, pero podrían ser importantes – DaveD

+0

Existen muchas herramientas que pueden rastrear el tiempo de procesamiento de las solicitudes. Pero este método es particular para rastrear el tiempo de procesamiento para las solicitudes autenticadas. Cuenta la historia de cada usuario y su tiempo de espera, no solo solicitudes genéricas. – Believe2014

Cuestiones relacionadas