Как добавить SQL ELMAH_Error.ErrorID в тему сообщения об ошибке ELMAH? - PullRequest
4 голосов
/ 22 декабря 2011

Я использую ELMAH для регистрации ошибок в базе данных SQL и отправки электронной почты.Я хотел бы добавить ELMAH_Error.ErrorId к теме электронного письма ELMAH.

Я сохраняю ErrorId, предоставленный ELMAH в событии ElmahLog_Logged, в переменную сеанса, как я обнаружил в этот вопрос .Сам Атиф Азиз прокомментировал эту запись в блоге следующую информацию относительно этого:

Если кто-то хочет получить трещину в зарегистрированной ошибке во время рассылки, его нужно будет найти всобытие ErrorLogModule.Logged.Это может быть удобно, например, для вставки идентификатора зарегистрированной ошибки в почту.Чтобы сделать это, вы должны спрятать Id из события Logged в HttpContext и использовать его позже в событии Mailing.Чтобы это работало, модули должны быть зарегистрированы таким образом, чтобы после события Logged произошло событие Mailing.

Я подумал, что поскольку модули httpModules добавляются сначала с ErrorLog, а затем с ErrorMail, это будет достигнуто.регистрация почтового события после зарегистрированного события.Я предполагаю, что речь идет о порядке событий, а не о порядке применения модулей.

Как вы регистрируете порядок событий HttpModules?

Я пыталсякод ниже безрезультатно.Приведенный ниже код запрещает отправку электронной почты, но ошибка все еще записывается в таблицу SQL.

Web.Config:

<system.web>
    <httpModules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>
    <httpHandlers>
        <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
</system.web>

... и ...

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    <handlers>
        <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </handlers>
</system.webServer>

И, конечно, они правильно настроены (я установил через NuGet).

Global.asax.cs:

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    Session["ElmahId"] = args.Entry.Id;
}

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    var elmahErrorId = Session["ElmahId"].ToString();
    e.Mail.Subject = String.Format("{0}, see ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);            
}

Если я изменю код события ErrorMail_Mailing в global.asax.cs на следующий код, я получу электронное письмо с темой, указанной в ErrorMail_MailingКод события как я должен.Я даже пытался просто указать Session.SessionID в теме, и это убивает функциональность электронной почты. Это заставляет меня думать, что событие ErrorMail_Mailing не имеет доступа к сеансу.Это правильно?

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    e.Mail.Subject = "I changed the subject in global.asax";
}

1 Ответ

5 голосов
/ 22 декабря 2011

Ответ был невероятно прост.Объект ErrorMailEventsArgs.Error содержит информацию о сеансе во время исключения.ErrorMail_Mailing даже не имеет доступа к контексту сеанса.Таким образом, решение так же просто, как извлечение вашей переменной из ErrorMailEventArgs.

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    var elmahErrorId = e.Error.SessionVariables["ElmahId"].ToString();
    if (!string.IsNullOrEmpty(elmahErrorId))
        e.Mail.Subject = String.Format("{0}, see ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);
}

Кроме того, просто поместив ElmahId в Session в событие ErrorLog_Logged, если ваш обработчик ErrorMail зарегистрирован после ErrorLog (это делается путем добавленияСначала ErrorLog в web.config), эта переменная сеанса будет в разделе переменных сеанса стандартного электронного сообщения об ошибке ELMAH.

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    Session["ElmahId"] = args.Entry.Id;
}

Обновление: Атиф Азиз выдвинул сообщение об ошибке Errors.SessionVariablesне в оригинальном источнике ELMAH, а в патче.Вот мой пакет .config:

<packages>
    <package id="elmah.corelibrary" version="1.2" />
    <package id="elmah" version="1.2.0.1" />
    <package id="elmah.sqlserver" version="1.2" />
</packages>
...