Si esto resulta útil para cualquier persona, con mucho gusto lo convertiré en una wiki comunitaria.Obteniendo más "granularidad" del MVC Mini Profiler
Tengo algunas páginas lentas en una aplicación MVC3, y dado que poco tiempo de ejecución parecía ocurrir en mi código, quería ver si podía averiguar más acerca de lo que llevó tanto tiempo. No es que lo haya logrado, pero obtuve un poco más de sabiduría en el camino.
No hay nada aquí que no sea obvio para cualquier persona con experiencia en MVC. Básicamente, he creado mi propia ActionFilterAttribute que tiene este aspecto:
public class ProfilerAttribute : ActionFilterAttribute
{
IDisposable actionStep = null;
IDisposable resultStep = null;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
actionStep = MiniProfiler.Current.Step("OnActionExecuting " + ResultDescriptor(filterContext));
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (actionStep != null)
{
actionStep.Dispose();
actionStep = null;
}
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
resultStep = MiniProfiler.Current.Step("OnResultExecuting " + ResultDescriptor(filterContext));
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (resultStep != null)
{
resultStep.Dispose();
resultStep = null;
}
base.OnResultExecuted(filterContext);
}
private string ResultDescriptor(ActionExecutingContext filterContext)
{
return filterContext.ActionDescriptor.ControllerDescriptor.ControllerName + "." + filterContext.ActionDescriptor.ActionName;
}
private string ResultDescriptor(ResultExecutingContext filterContext)
{
var values = filterContext.RouteData.Values;
return String.Format("{0}.{1}", values["controller"], values["action"]);
}
Esto parece funcionar bien, y en mi caso he aprendido que la mayoría de las veces es en realidad pasó en la parte ResultExecuting de la vida, no dentro de mi comportamiento.
Sin embargo, tengo algunas preguntas sobre este enfoque.
1) ¿Es esta una forma segura de hacer las cosas? Supongo que no, ya que el filtro de acción se crea solo una vez, en el método RegisterGlobalFilters() en Global.asax.cs. Si aparecen dos solicitudes a la vez, actionStep y resultStep carecerán de valor. ¿Es esto cierto? Si es así, ¿puede alguien que sepa más que yo contribuir de una manera inteligente para manejar esto? Funciona para mí durante el perfilado de máquinas locales, pero probablemente no tanto implementado en un servidor con varias personas haciendo solicitudes al mismo tiempo.
2) ¿Hay alguna forma de obtener más información sobre el proceso de ejecución de resultados? ¿O debería simplemente aceptar que renderizar la vista, etc. toma el tiempo que lleva? En mi propia aplicación, me aseguro de que todo el acceso a la base de datos finalice antes de que se termine mi método de acción (usando NHibernate Profiler en mi caso), y me gusta mantener mi punto de vista esbelto y simple; Sin embargo, cualquier tipo de idea de lo que ralentiza la renderización podría ser útil. Supongo que usar Mini Perfilador en mi modelo de objetos aparecería aquí, si algún código lento de mi parte se ejecutara aquí.
3) Los métodos de ResultDescriptor son probablemente malos y venenosos. Han trabajado para mí en mis pruebas, pero probablemente necesitarían ser reemplazados por algo más sólido. Solo fui con las primeras versiones que me dieron algo a mitad de camino.
Cualquier otro comentario a esto también sería muy bienvenido, incluso si son "Esta es una mala idea, ve a morir solo".
Si desea seguridad de la solicitud, ¿por qué no utiliza eventos de la aplicación relacionados con el ciclo de vida de la solicitud? http://stackoverflow.com/a/24197984/3481183 – Believe2014