2010-12-14 39 views
0

我正在使用ELMAH進行錯誤記錄,並且如果錯誤發生在部分回發期間(來自包裝在更新面板中的控件的事件處理程序),那麼它將記錄錯誤兩次。我不使用「MsAjaxDeltaErrorLog」模塊,而是以編程方式記錄來自ScriptManager控件的「AsyncPostBackError」事件處理程序的錯誤。我這樣做是爲了避免重定向到泛型頁面,以避免在部分回發期間發生錯誤。我在web.config中關閉了重定向。這裏是記錄異常由ELMAH記錄兩次的Ajax錯誤

protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) 
    { 
     HttpContext.Current.Items["AjaxError"] = "Ajax"; 
     ErrorSignal.FromCurrentContext().Raise(e.Exception,HttpContext.Current); 
    } 

    and in Global.asax, I am redirecting manually 

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs e) 
{ 
    if (!HttpContext.Current.Items.Contains("AjaxError")) 
    { 
        var pageName = e.Entry.Error.StatusCode == 404 ? "FileNotFoundPage" : "GenericErrorPage"; 
        var redirectPage = ConfigurationManager.AppSettings[pageName]; 
        Response.Redirect(String.Format("{0}?ExceptionId={1}&ExceptionMessage={2}", redirectPage, Server.UrlEncode(e.Entry.Id), 
             Server.UrlEncode(e.Entry.Error.Message))); 
    } 
} 

回答

0

從ELMAH網站代碼:
(http://code.google.com/p/elmah/wiki/MSAjax)

潛在問題

不幸的是, MsAjaxDeltaErrorLogModule不是 完美的解決方案。由於 的工作方式,在ELMAH中有兩次錯誤會記錄兩次,這兩次錯誤的可能性非常小。對於這個 發生,下面一定會發生:一個局部回傳

  • 前 System.Web.UI.PageRequestManager的OnInit方法是 稱爲它必須發生時必須發生

    1. 未處理的異常。

    這將意味着,無論是標準 ELMAH模塊和 MsAjaxDeltaErrorModule將捕獲 例外。

    在現實中,發生這種 的機會將是相當 纖細。 .NET Framework 3.5

    Microsoft Ajax 的更新版隨附於.NET Framework的3.5版本。這個新版本 改變了處理Partial PostBacks中的意外錯誤 的方式, 刪除了對Response.End的調用。 因此,如果您繼續使用 MsAjaxDeltaErrorLogModule與此 版本的框架,你會看到 在ELMAH被記錄兩次在部分 回傳的所有未處理的錯誤。*

  • IM在你同一位置,每當我得到一個異常的錯誤,我得到的問題記錄了兩次,但我想卡住,除非我們修改ELMAH的源代碼