Проблема передачи идентификатора журнала ELMAH на страницу пользовательских ошибок в ASP.NET - PullRequest
6 голосов
/ 22 мая 2010

Я использую ELMAH для регистрации необработанных исключений в приложении ASP.NET Webforms. Ведение журнала работает нормально.

Я хочу передать идентификатор журнала ошибок ELMAH на пользовательскую страницу ошибок, которая даст пользователю возможность отправить администратору электронное сообщение об ошибке. Я последовал совету этого ответа . Вот мой global.asax код:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{        
    Session[StateKeys.ElmahLogId] = args.Entry.Id;

    // this doesn't work either:
    // HttpContext.Current.Items[StateKeys.ElmahLogId] = args.Entry.Id;
}

Но на странице пользовательских ошибок ссылка на переменную сеанса и HttpContext.Current.Items дают мне исключение NullReference Как я могу передать идентификатор на мою страницу ошибки?

Ответы [ 2 ]

7 голосов
/ 25 мая 2010

Это работает для меня:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    if (args.Entry.Error.Exception is HandledElmahException)
        return;

    var config = WebConfigurationManager.OpenWebConfiguration("~");
    var customErrorsSection = (CustomErrorsSection)config.GetSection("system.web/customErrors");        

    if (customErrorsSection != null)
    {
        switch (customErrorsSection.Mode)
        {
            case CustomErrorsMode.Off:
                break;
            case CustomErrorsMode.On:
                FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect);
                break;
            case CustomErrorsMode.RemoteOnly:
                if (!HttpContext.Current.Request.IsLocal)
                    FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect);
                break;
            default:
                break;
        }
    }        
}

void FriendlyErrorTransfer(string emlahId, string url)
{
    Server.Transfer(String.Format("{0}?id={1}", url, Server.UrlEncode(emlahId)));
}
2 голосов
/ 20 июня 2014

Невозможно прокомментировать решение Ронни. У меня это было какое-то время, но это нарушает стандартный процесс потока ошибок и заставляет ErrorLog_Logged всегда передавать, даже когда вызывается

Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

Это проблема, если вы все еще хотите регистрировать ошибку из оператора catch, например, у вас есть обходной путь для ошибки, но вы хотите зарегистрировать ошибку, чтобы выполнить правильное исправление, которое может быть очень полезно в трудных для повторяющиеся проблемы.

Мне удалось исправить это с помощью следующего изменения:

//if (customErrorsSection != null)    
if (customErrorsSection != null && this.Context.Error != null)

Это правильно учитывает типичную обработку ошибок, так как context.Error будет нулевым в случаях, когда вы явным образом возбуждаете исключение в Elmah, но не равным NULL при падении через обработку ошибок по умолчанию (не через catch или если перехвачено -thrown). Это приводит к тому, что решение Ронни реагирует аналогично логике обработки ошибок .Net.

...