我的每个asp.net页面都有一个小方法,用于在数据库中记录用户统计信息。我刚刚为Global.asax添加了两个方法来捕获页面的加载时间,但我也希望能够在代码隐藏的各个页面上访问该结果,这样我就可以在页面加载期间将其与其他页面一起记录下来信息。
这是我的Global.asax
中的代码protected void Application_BeginRequest(object sender, EventArgs e)
{
Context.Items["loadstarttime"] = DateTime.Now;
}
protected void Application_EndRequest(object sender, EventArgs e)
{
DateTime end = (DateTime)Context.Items["loadstarttime"];
TimeSpan loadtime = DateTime.Now - end;
Response.Write("<br/><br/><br/><h3>This page took " + loadtime + "ms to load</h3>");
}
答案 0 :(得分:0)
在你的问题中获得总处理时间并在正确的时刻在页面中呈现它的麻烦是不可能实现的。
当你有最后的时间时,将字节发送到客户端的流很早就消失了,而且无法向它添加任何内容。
因此,在html中获取正确呈现内容的唯一选择是向页面添加控件,因为它的主要任务是呈现从BeginRequest
到呈现特定控件的时间。
该控件如下所示:
namespace MyNamespace
{
public class Time : Control
{
protected override void Render(HtmlTextWriter writer)
{
// no error checking whatsoever! Add that before using!
writer.Write("<h3>render time: {0}</h3>",
DateTime.Now - (DateTime)Context.Items["loadstarttime"]);
}
}
}
我把它放在这样的页面上:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="plain.aspx.cs" Inherits="plain" %>
<%@ Register tagPrefix="my" namespace="MyNamespace" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
.. removed stuff ...
<my:Time runat="server"></my:Time>
</body>
</html>
这将在结束标记发送到输出流之前呈现。
现在你可以稍微渲染一下但是为了符合html,你需要渲染一个注释。您可以通过覆盖页面上的Render
方法来执行此操作:
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
writer.Write("<!-- render time {0} -->", DateTime.Now - (DateTime)Context.Items["loadstarttime"]);
}
这会在客户端给你这个html输出:
...
<h3>render time: 00:00:01.9361936</h3>
</body>
</html>
<!-- render time 00:00:01.9381938 -->
渲染方法Unload
发生在page life cycle后,该页面上的说明显示:
在卸载阶段,页面及其控件已呈现,因此您无法对响应流进行进一步更改。如果您尝试调用Response.Write方法之类的方法,该页面将抛出异常。
如果您对总请求时间真正感兴趣,那么您可以执行的操作是存储它并在下次呈现页面时使用它(或计算平均值)。然后,您可以呈现如下内容:
Last processing time : 0.2333
average processing time: 0.15
通过在EndRequest
中收集这些统计信息,但不能包含当前页面的结果。
在面向开发人员的性能和页面结构视图中查看Tracing
。