tutorial net mvc español asp asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

español - Medir el tiempo invocando las acciones de ASP.NET MVC Controller



mvc asp.net c# (4)

¿Podrías crear un filtro de acción global? Algo como esto:

public class PerformanceTestFilter : IActionFilter { private Stopwatch stopWatch = new Stopwatch(); public void OnActionExecuting(ActionExecutingContext filterContext) { stopWatch.Reset(); stopWatch.Start(); } public void OnActionExecuted(ActionExecutedContext filterContext) { stopWatch.Stop(); var executionTime = stopWatch.ElapsedMilliseconds; // Do something with the executionTime } }

y luego agréguelo a su colección de GlobalFilters en `Application_Start () ''

GlobalFilters.Filters.Add(new PerformanceTestFilter());

Puede obtener detalles sobre el controlador que se está probando desde el parámetro filterContext .

ACTUALIZAR

Agregar el filtro a la colección GlobalFilters directamente creará una instancia única del filtro para todas las acciones. Esto, por supuesto, no funcionará para sincronizar solicitudes concurrentes. Para crear una nueva instancia para cada acción, cree un proveedor de filtro:

public class PerformanceTestFilterProvider : IFilterProvider { public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { return new[] {new Filter(new PerformanceTestFilter(), FilterScope.Global, 0)}; } }

Luego, en lugar de agregar el filtro directamente, en lugar de agregar el proveedor del filtro en Application_Start() :

FilterProviders.Providers.Add(new PerformanceTestFilterProvider());

Algunos usuarios de una aplicación MVC 4 están experimentando lentitud esporádica. Presumiblemente, no todos los usuarios reportan ese problema cada vez que les sucede.

Mi idea es medir el tiempo empleado en cada acción del controlador y registrar los detalles de las invocaciones de acción que excedan el tiempo prescrito para facilitar un análisis adicional (para descartar o descartar un problema de servidor / código).

¿Hay alguna forma conveniente de conectarse para realizar dichas mediciones de modo que pueda evitar agregar código de instrumentación a cada acción? Actualmente no estoy usando IOC para este proyecto y dudaría en presentarlo solo para resolver este problema.

¿Hay una mejor manera de abordar este tipo de problema?


Actualización: instale mi paquete StopGatch NuGet con el paquete InstallWatch StopWatch, vea Perfil y programe su aplicación ASP.NET MVC hasta Azure

Vea mi tutorial Uso de métodos asíncronos en ASP.NET MVC 4 que tiene un temporizador de filtro de acción global. Podría utilizar ELMAH para registrar los datos. Mi muestra Mi muestra http://msdn.microsoft.com/en-us/library/gg416513(v=vs.98) también tiene el mismo filtro de tiempo y es más simple, pero es anterior a Razor.

Busque el atributo de cronómetro para habilitar el tiempo.

public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new UseStopwatchAttribute()); } }


Normalmente agrego este código simple al final de mi vista de Diseño:

<!-- Page generated in @((DateTime.UtcNow - HttpContext.Current.Timestamp.ToUniversalTime()).TotalSeconds.ToString("F4")) s -->

Produce algo como:

<!-- Page generated in 0.4399 s -->

Esto comienza a medir cuando se crea el HttpContext (según la documentación ) y se detiene justo antes de escribir en la salida, por lo que debería ser bastante preciso.

Es posible que no funcione en todos los casos de uso (si desea medir acciones secundarias o ignorar el tiempo fuera de la acción de MVC, etc.), pero es fácil de pegar en una vista.

Para diagnósticos más avanzados, solía usar Glimpse .


Prueba la instrumentación de página ASP.NET 4.5

Instruye el procesamiento de la página: el tiempo de su aplicación puede gastarse en el controlador, pero hay muchas veces en las que se gasta en la visualización. Especialmente si tienes muchos parciales y ayudantes html.