2012-03-06 62 views
3

我正在開發一個asp.net mvc應用程序。我的應用程序,如下所述結構:如何使Elmah使用UnobservedTaskException工作

  1. 用於訪問數據庫
  2. 一個ServiceLayer //層DBAccessLayer //層連接1和3
  3. 一個WebLayer //網絡用戶界面層

我想記錄所有應用程序異常,包括TaskScheduler.UnobservedTaskException事件中的異常。

我測試過如下操作:

protected void Application_Start() 
{ 
    ... 
    TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs excArgs) => 
    { 
     ErrorSignal.FromCurrentContext().Raise(excArgs.Exception);  
     excArgs.SetObserved(); 
    }; 
} 

但當UnobservedTaskException事件被觸發,該應用程序與下面的異常崩潰:

System.ArgumentNullException was unhandled 
     Message=Value cannot be null. 
     Parameter name: context 
     Source=Elmah 
     ParamName=context 
    StackTrace: 
     at Elmah.ErrorSignal.FromContext(HttpContext context) in c:\builds\ELMAH\src\Elmah\ErrorSignal.cs:line 67 
     at MyMvcApplication.<Application_Start>b__0(Object sender, UnobservedTaskExceptionEventArgs excArgs) in ...\Global.asax.cs:line 82 
     at System.Threading.Tasks.TaskScheduler.PublishUnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs ueea) 
     at System.Threading.Tasks.TaskExceptionHolder.Finalize() 

另外,我把UnobservedTaskException事件在WebLayer的global.asax.cs中,當DBAccessLayer和ServiceLayer有未被發現的異常時,它可以被觸發嗎?

謝謝。

+0

並不直接回答你的問題,但我們已經在我們的應用程序代碼,試圖獲取當前的HttpContext。如果成功,它會通過Elmah記錄,否則會生成一封電子郵件... – Jon 2012-03-06 01:20:12

回答

0

它看起來像你的處理程序被觸發時,沒有HttpContext,因爲計劃的任務沒有作爲HTTP請求的一部分運行。除了使用

ErrorSignal.FromCurrentContext().Raise 

的,你可以使用

ErrorLog.GetDefault(null).Log 
+0

剛剛意識到這個問題有多大年齡...... – PabloC 2012-09-12 14:56:34