Elmah: исключения без HttpContext?

Я создаю поток на Application_Start и хочу записывать исключения. Нет Context/HttpContext/HttpContext.Current, так как я могу получить его для регистрации?

На данный момент это не вызывает каких-либо исключений в моих потоках, и если я пишу ErrorSignal.FromCurrentContext().Raise(ex);, я получаю сообщение об ошибке, не может быть нулевым.

Возможно, я могу создать фиктивный HttpContext, но почему-то я не думаю, что это будет хорошо работать.

-edit - Я пробовал ErrorSignal.Get(new HttpApplication()).Raise(ex);, и, похоже, это не исключение.

Ответ 1

Убедитесь, что вы установили имя своего приложения в web.config

<errorLog type="Elmah.SqlErrorLog, Elmah" 
          connectionStringName="nibWeb" 
          applicationName="Nib.Services" />

а затем

ErrorLog.GetDefault(null).Log(new Error(error));

будет работать

Ответ 2

Я не использовал <errorLog>, как в ответе Брендана Кэри, потому что я только регистрировал в памяти. Тем не менее, его команда отлично поработала в моем случае, не назвав приложение:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something.")));

Мне пришлось перекомпилировать Elmah с .NET 4.0 из-за ошибки в необходимости использования System.Web.Abstractions 3.5.0.0. Мое скомпилированное forfor.NET.NET fork здесь, если кто-то хочет его (также сильное именование):

http://code.google.com/r/scottstafford-elmah/

Ответ 3

Для моего приложения я сохранил this.Context.ApplicationInstance в Application_Start, чтобы я мог вызвать Elmah.ErrorSignal.Get с сохраненным экземпляром. С помощью ErrorSignal я мог бы Raise. Это проходит через все фильтры электронной почты.

Ниже приведен код. Я использую FluentScheduler для

public class Global : HttpApplication {
    void Application_Start(object sender, EventArgs e) {

        var application = Context.ApplicationInstance;
        FluentScheduler.TaskManager.UnobservedTaskException +=
            (FluentScheduler.Model.TaskExceptionInformation i, UnhandledExceptionEventArgs a) =>
                Elmah.ErrorSignal.Get(application).Raise(i.Task.Exception);

    }
}