Я использую 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";
}