如何将请求持续时间添加到 MVC3 错误处理程序 ASP.NET
本文关键字:处理 错误 程序 ASP NET MVC3 请求 持续时间 添加 | 更新日期: 2023-09-27 18:32:34
代码在Global.asax中用于记录错误 ASP.NET MVC3应用程序。
一些错误是由于从PostgreSQL服务器读取数据超时而实现的。
如何为此添加请求持续时间日志记录?是否有一些在 MVC3 中提供请求开始时间的配置文件?
我查看了样品
http://www.codeproject.com/Articles/550510/Exception-Handling-and-NET
http://msdn.microsoft.com/en-US/library/24395WZ3(v=vs.100).aspx
Global.asax - Application_Error - 如何获取主页数据?
http://www.velocityreviews.com/forums/t99686-global-asax-application_error-how-to-get-informations-about-the-exception.html
但还没有找到这样的样本。
void Application_Error(object sender, EventArgs e)
{
var sb = new StringBuilder();
var url = HttpContext.Current.Request.Url;
sb.AppendLine("Url " + url.ToString());
foreach (var d in Request.Form.AllKeys)
sb.AppendLine(d.ToString() + ":" + Request.Form[d].ToString());
sb.AppendLine();
foreach (var d in Request.Headers.AllKeys)
sb.AppendLine(d.ToString() + "'t" + Request.Headers[d].ToString());
Exception exception = Server.GetLastError();
MyLogger.WriteException(exception, "Application_Error", sb.ToString());
}
如果通过请求,您引用的是 HTTP 请求,则可以将 Application_BeginRequest 和 Application_EndRequest 与 ThreadStatic 秒表结合使用,如下所示:
public class MvcApplication : System.Web.HttpApplication
{
[ThreadStatic]
private static Stopwatch stopwatch;
protected void Application_Start()
{
//...
}
protected void Application_BeginRequest()
{
stopwatch = new Stopwatch();
stopwatch.Start();
}
protected void Application_EndRequest()
{
stopwatch.Stop();
var elapsedTime = stopwatch.ElapsedMilliseconds;
//log time...
stopwatch.Reset();
}
}
在您的情况下Application_EndRequest,您可以使用
protected void Application_Error(object sender, EventArgs e)
{
//...
stopwatch.Stop();
var time = stopwatch.ElapsedMilliseconds;
stopwatch.Reset();
//...
}
你应该意识到一些问题,当线程静态:看这里.如果你不想使用 ThreadStatic,你可以像这样使用 HttpContext.Current.Items :
protected void Application_BeginRequest()
{
var stopwatch = new Stopwatch();
stopwatch = new Stopwatch();
stopwatch.Start();
HttpContext.Current.Items.Add("RequestStopwatch", stopwatch);
}
protected void Application_Error(object sender, EventArgs e)
{
//...
if (HttpContext.Current.Items["RequestStopwatch"] != null)
{
var stopwatch = (Stopwatch)HttpContext.Current.Items["RequestStopwatch"];
stopwatch.Stop();
var time = stopwatch.ElapsedMilliseconds;
//log time...
HttpContext.Current.Items.Remove("RequestStopwatch");
}
//...
}
您可以在配置文件中为这样的路径添加请求持续时间
<location path="your path here">
<system.web>
<httpRuntime executionTimeout="600" />
</system.web>
或者您也可以将其设置到控制器中
HttpContext.Server.ScriptTimeout = timeout value here;
你自己计时。在 BeginRequest 处理程序中,启动秒表,然后将其保存到 HttpContext.Items。然后在错误处理程序中,将其取回并停止。对整个请求进行计时的方法相同,只是您在 EndRequest 中执行停止部分。
看看这个例子,它是一个http模块,它对请求进行计时,然后将其添加到回复中。