问:如何计算呈现MVC页面并在母版页上显示时间所需的总时间。
在Asp.net Web表单中,我创建了一个基页类:
public class PageBase : System.Web.UI.Page
{
private DateTime startTime = DateTime.Now;
private TimeSpan renderTime;
public DateTime StartTime
{
set { startTime = value; }
get { return startTime; }
}
public virtual string PageRenderTime
{
get
{
renderTime = DateTime.Now - startTime;
return renderTime.Seconds + "." + renderTime.Milliseconds + " seconds";
}
}
}
然后我会在我的母版页上调用该方法:
<div id="performance">
<% =PageRenderTime %>
</div>
问:我如何使用MVC框架完成同样的事情?
问:使用MVC框架,我在哪里设置首次创建页面的开始时间?
答案 0 :(得分:11)
执行此操作的最佳方法是计算请求时间。开始请求和结束请求.... 看看这篇伟大的帖子:
http://haacked.com/archive/2008/07/02/httpmodule-for-timing-requests.aspx
答案 1 :(得分:4)
进入你的web.config并确保你有......
<system.web>
<trace enabled="true" localOnly="false" />
</system.web>
然后你可以转到http://.../trace.axd并查看每个请求。
然后你想看看From First(s)列,最后一个是渲染页面所花费的时间(服务器端)。
示例...
aspx.page End Render 0.06121112 0.005297
61.2 ms来渲染页面。
如果您正在寻找时间代码本身,或者您想手动执行某些诊断,则需要使用System.Diagnostics.Stopwatch类而不是DateTime。
Stopwatch sw = Stopwatch.StartNew();
...
sw.Stop();
Trace.Write(sw.ElapsedMilliseconds);
答案 2 :(得分:2)
我可能会覆盖Controller类上的OnActionExecuting和OnActionExecuted方法。
public class BaseController : Controller {
// Called before the action is executed
public override void OnActionExecuting(ActionExecutingContext ctx) {
base.OnActionExecuting(ctx);
// Start timing
}
// Called after the action is executed
public override void OnActionExecuted(ActionExecutedContext ctx) {
base.OnActionExecuted(ctx);
// Stop timing
}
}
答案 3 :(得分:1)
创建一个基本控制器并让控制器从中派生出来。在构造函数中设置开始时间并覆盖Dispose()并计算总时间。这应该让你在行动的整个生命周期中端到端。由于Controller实现了IDisposable,我假设渲染引擎会在计算结果后处理它,你不必等待垃圾收集。如果我的假设是错误的,你可以改用OnResultExecuted()。
编辑:要在页面上获取渲染时间会比较困难,因为根据定义,在您将时间放在页面上之前无法完成渲染,而您无法进行渲染页面完成渲染的时间。但是,您可以将渲染时间写入会话,然后使用AJAX返回并获取渲染时间以便稍后显示。您可以通过将开始时间放在ViewData中并在视图本身中计算渲染时间来近似它。您可能想尝试记录渲染时间并进行视图近似,看看它的接近程度。
此代码可用于记录渲染时间。
public class BaseController : Controller
{
private DateTime StartTime { get; set; }
public BaseController() : base()
{
StartTime = DateTime.Now;
}
public override void Dispose( bool disposing )
{
var totalTime = DateTime.Now - this.StartTime;
... write it out somewhere ...
}
}