0

以下のコードは 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());
    }
4

3 に答える 3

1

リクエストによって 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 の場合、いくつかの問題に注意する必要があります。ここを参照してください 。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");
    }
    //...
}
于 2013-09-23T09:22:07.457 に答える
1

このようなパスのリクエスト期間を構成ファイルに追加できます

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

または、コントローラーにも設定できます

HttpContext.Server.ScriptTimeout = timeout value here;
于 2013-09-23T08:40:08.823 に答える
0

あなたはそれを自分で計ります。BeginRequest ハンドラーでストップウォッチを開始し、HttpContext.Items に保存します。次に、エラー ハンドラで、元に戻して停止します。リクエスト全体のタイミングを計るのと同じアプローチですが、EndRequest で停止部分を行うだけです。

このを見てください。これは、リクエストの時間を計って応答に追加する http モジュールです。

于 2013-09-23T08:36:21.907 に答える