我想计算任何操作所用的时间并将其保存在数据库中。 我不要在所有行动中使用秒表。
我正在寻找一种可以应用于整个项目asp.net MVC的方法 换句话说每次执行一个动作都会发生一个事件?
答案 0 :(得分:4)
你必须做这样的事情。 1.创建过滤器。
public class ActionExecutionTimeAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Items["ActionName"] = filterContext.HttpContext.Request.RawUrl;
filterContext.HttpContext.Items["StartTime"] = DateTime.UtcNow;
base.OnActionExecuting(filterContext);
}
// Do this to calculate only Action Execution Time
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
DateTime startTime = (DateTime)filterContext.HttpContext.Items["StartTime"];
System.Diagnostics.Debug.WriteLine(filterContext.HttpContext.Items["ActionName"].ToString() + "-" + (DateTime.UtcNow - startTime).TotalMilliseconds);
}
// Do this to calcution of Action Start to Result Process
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
DateTime startTime = (DateTime)filterContext.HttpContext.Items["StartTime"];
System.Diagnostics.Debug.WriteLine(filterContext.HttpContext.Items["ActionName"].ToString() + "- (R)" + (DateTime.UtcNow - startTime).TotalMilliseconds);
}
}
2。在Global.asax中注册
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new ActionExecutionTimeAttribute());
}
}
答案 1 :(得分:0)
使用来自StackOverflow制造商的MiniProfiler。非常易于使用,默认情况下会进行测量,例如执行控制器操作。