C# 如何将请求持续时间添加到ASP.NET MVC3错误处理程序

C# 如何将请求持续时间添加到ASP.NET MVC3错误处理程序,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,下面的代码是在Global.asax中用来记录错误的是ASP.NET MVC3应用程序 一些错误与从PostgreSql server读取数据超时有关 如何将请求持续时间日志添加到此日志中? 在MVC3中是否有提供请求开始时间的程序 我在实验室里查看了样品 但我还没有找到这样的样本 void Application_Error(object sender, EventArgs e) { var sb = new StringBuilder();

下面的代码是在Global.asax中用来记录错误的是ASP.NET MVC3应用程序

一些错误与从PostgreSql server读取数据超时有关

如何将请求持续时间日志添加到此日志中? 在MVC3中是否有提供请求开始时间的程序

我在实验室里查看了样品

但我还没有找到这样的样本

    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());
    }

你自己计时。在BeginRequest处理程序中,启动秒表,然后将其保存到HttpContext.Items。然后在错误处理程序中,将其取回并停止。对整个请求计时的方法相同,只有在EndRequest中执行停止部分


看看这个,这是一个http模块,它对请求进行计时,然后将其添加到repsonse。

您可以在配置文件中为这样的路径添加请求持续时间

<location path="your path here">
<system.web>
    <httpRuntime executionTimeout="600" />
</system.web>

如果按请求引用HTTP请求,则可以将应用程序_BeginRequest和应用程序_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();
    }
}
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");
    }
    //...
}
在您的情况下,您可以使用

protected void Application_Error(object sender, EventArgs e)
{
    //...
    stopwatch.Stop();
    var time = stopwatch.ElapsedMilliseconds;
    stopwatch.Reset();
    //...
}
当ThreadStatic时,您应该注意一些问题: . 如果不想使用ThreadStatic,可以使用HttpContext.Current.Items,如下所示:

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();
    }
}
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");
    }
    //...
}

您希望捕获的持续时间是什么类型的错误?如果您想对实际映射到某个路由的那些路由进行计时,可以使用全局筛选器。为什么要使用[code>If(HttpContext.Current.Items[“RequestStopwatch”]!=null)check?它应该始终不为null。是的,您是正确的,它不应该为null,所以如果您确信它不会在请求中的某个地方被删除,那么这个if条件可以被删除。我把它放在这里是为了防止请求中的某个人(例如:控制器中的Action方法)删除“RequestStopwatch”项。