2013-09-23 30 views
0

以下代碼用於在Global.asax中記錄錯誤是ASP.NET MVC3應用程序。如何向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 - How can I get Page data?

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

什麼類型的錯誤,你想捉的時間?如果你想爲那些實際映射到路線上的人定時,你可以使用全局過濾器。 –

回答

1

如果請求時,你是重新申請HTTP請求,你可以使用Application_BeginRequest和Application_EndRequest和ThreadStatic Stopwatch結合使用,如下所示:

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:look here 。如果你不希望使用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"); 
    } 
    //... 
} 
+0

爲什麼'if(HttpContext.Current.Items [「RequestStopwatch」]!= null)'check is used?它總是不爲空 – Andrus

+0

是的,你是正確的,它不應該是空的,所以如果條件可以被刪除,如果你確信它不會被刪除的地方在請求內部。我把這個放在這裏,以防某人在請求內的某個地方(例如:控制器內的Action方法)刪除「RequestStopwatch」項目。 –

0

你自己動手吧。在BeginRequest處理程序中啓動一個秒錶,然後將其保存到HttpContext.Items。然後在錯誤處理程序中,取回並停止它。對整個請求進行計時的方法相同,只有您在EndRequest中執行停止部分。

看看這個example,它是一個http模塊,它將請求時間添加到repsonse中。

1

您可以在配置文件中添加請求持續時間的路徑是這樣

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

,或者你可以將它設置成你的控制器還

HttpContext.Server.ScriptTimeout = timeout value here; 
相關問題