我正在寻找的是某种方法来监视系统中每个页面的page_load,以计算出请求与发送回用户的数据结束之间的时间间隔。
我希望做到 100% 服务器端,并且我不想对应用程序代码进行任何代码更改。如果需要更改应用程序代码,是否有标准位置可以进行这些更改?我正在考虑某种 web.config 类型参数,它将信息记录到位置/数据库。我们可以做处理部分,只需要原始数据。
我希望收集的信息是:
- 页面名称(包括查询字符串)
- 请求的日期时间
- 花费的时间
- 我们可以获取有关请求的任何其他信息!
显然,先决条件是它不应该影响性能。
我也在寻找低成本的东西,或者我们可以用来开发系统的方法。
其他信息: 更清楚地说,我们可以完全控制 IIS 和底层操作系统,但是,网站应用程序不在我们的控制范围内。我们可以更改配置文件,但不能更改应用程序的实际代码。
我们目前使用的是 IIS 6.0,但是,如果这种事情更高效,并且/或可以开箱即用,使用 IIS 7.0/7.5 那么它可能会加快向此方向的迁移,所以很高兴听到这些建议。
最佳答案
这不是 WebForms 问题,而是 ASP.net 问题。使用 global.asax
或 IHttpModule
Hook 到 BeginRequest
/EndRequest
事件来跟踪请求的持续时间需要。
StopWatchModule.cs
class StopWatchModule: IHttpModule
{
private Int64 _requestStartTicks;
public void Init(HttpApplication application)
{
application.Context.BeginRequest += Application_BeginRequest;
application.Context.EndRequest += Application_EndRequest;
}
private void Application_BeginRequest(object sender, EventArgs e)
{
_requestStartTicks = Stopwatch.GetTimestamp();
}
private void Application_EndRequest(object sender, EventArgs e)
{
Int64 requestStopTicks = Stopwatch.GetTimestamp();
Double requestDurationMs = (Double)(requestStopTicks - _requestStartTicks) / Stopwatch.Frequency / 1000000f;
/*
Sample output:
Request for "~/EditCustomer.aspx" took 37 ms to complete
*/
HttpContext context = ((HttpApplication)sender).Context;
Logger.Info("Request for \"{0}\" to {1} ms to complete",
context.Request.AppRelativeCurrentExecutionFilePath,
requestDurationMs.ToString("r", CultureInfo.InvariantCulture));
}
}
Web.config
<configuration>
<system.web>
<httpModules>
<add name="StopWatchModule" type="StopWatchModule" />
</httpModules>
</system.web>
</configuration>
我是凭内存写的,所以上面可能会有错误,但这就是想法。您的日志消息可以根据您的需要详细说明。 Logger 是某种类型的日志库。我更喜欢 log4net,但选择权在你。
关于ASP.NET监控page_load性能(无需更改代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8537596/