2012-03-06 2 views
3

Я разрабатываю приложение asp.net mvc. Архитектура моего приложения, как показано ниже:Как заставить Elmah работать с UnobservedTaskException

  1. DBAccessLayer // слой для доступа к базе
  2. ServiceLayer // слой для подключения 1 и 3.
  3. слой WebLayer // Web UI

Я хочу регистрировать все исключения приложений, включая исключения в событии 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 в global.asax.cs WebLayer, может ли он быть запущен, когда DBAccessLayer и ServiceLayer имеют незаметные исключения?

Спасибо.

+0

ли не прямо ответить на ваш вопрос, но у нас есть код в наших приложениях, которые пытаются получить текущую HttpContext. Если он преуспеет, он регистрируется через Elmah, в противном случае он генерирует электронную почту ... – Jon

ответ

0

Похоже, что когда ваш обработчик запущен, не существует HttpContext, потому что запланированная задача не выполняется как часть HTTP-запроса. Вместо того чтобы использовать

ErrorSignal.FromCurrentContext().Raise 

вы могли бы использовать

ErrorLog.GetDefault(null).Log 
+0

Просто понял, сколько лет этот вопрос ... – PabloC

Смежные вопросы