Run*_*sen 11 asp.net-mvc mvc-mini-profiler
如果这对任何人都有用,我很乐意把它变成社区维基.
我在MVC3应用程序中有一些慢页面,并且因为我的代码中似乎很少执行时间,所以我想知道是否可以找到更多关于花了这么长时间的内容.并不是说我成功了,但我在这个过程中获得了更多的智慧.
对于拥有一些MVC经验的人来说,这里没有什么是不明显的.基本上,我创建了自己的ActionFilterAttribute,如下所示:
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"]);
}
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好,在我的情况下,我已经了解到大部分时间实际上是花在ResultExecuting生活的一部分,而不是在我的行动中.
但是,我对这种方法有一些疑问.
1)这是一种请求安全的做事方式吗?我猜不是,因为actionfilter只在Global.asax.cs的RegisterGlobalFilters()方法中创建了一次.如果同时出现两个请求,actionStep和resultStep将毫无价值.这是真的?如果是这样,那些比我更了解的人可以提供一个聪明的方法来处理这个问题吗?在本地计算机分析期间可以为我工作,但可能没有在多个人同时发出请求的服务器上部署.
2)有没有办法更深入地了解结果执行过程?或者我应该接受渲染视图等需要花费的时间?在我自己的应用程序中,我确保在我的操作方法结束之前完成所有数据库访问(在我的情况下使用NHibernate Profiler),并且我希望保持我的视图苗条和简单; 但是,对减慢渲染效果的任何见解仍然有用.我想在我的模型对象中使用Mini Profiler会显示在这里,如果我这里执行了任何慢速代码.
3)ResultDescriptor方法可能是邪恶和有毒的.他们在我的测试中为我工作,但可能需要被更强大的东西取代.我刚刚使用了第一个版本,它给了我一些有用的东西.
对此的任何其他评论也将非常受欢迎,即使它们是"这是一个坏主意,独自去死".
这看起来很酷.我相信这不是一种安全的做事方式.
你可以将它链接到HttpContext.Items这样
HttpContext.Items.Add("actionstep", actionStep);
HttpContext.Items.Add("resultstep", resultStep);
Run Code Online (Sandbox Code Playgroud)
然后以类似的方式检索它
actionStep = HttpContext.Items["actionstep"];
resultStep = HttpContext.Items["resultstep"];
Run Code Online (Sandbox Code Playgroud)
显然,你自己检查空值等等.
的HttpContext是为每个用户/请求不同.
要记住的事情HttpContext.Current.Session.SessionID我有时会忘记它是当前HTTP请求的SessionId(即每当你点击F5或以其他方式发出新请求时它都会改变).另一个要记住的重要事项是,在任何时间,所有HttpContext.Current.Session.SessionID值都必须是唯一的(即每个用户或请求一个),它们可以重复使用,因此不要将它们视为仅使用一次的GUID每.
| 归档时间: |
|
| 查看次数: |
1316 次 |
| 最近记录: |