Ich verwende ELMAH, um Fehler in einer SQL-Datenbank zu protokollieren und eine E-Mail zu senden. Ich möchte die ELMAH_Error.ErrorId dem Betreff der ELMAH-E-Mail hinzufügen.
Ich speichere die ErrorId, die ELMAH im ElmahLog_Logged-Ereignis bereitstellt, in einer Session-Variablen, wie ich in dieser Frage entdeckt habe. Atif Aziz selbst hat in diesem Blog-Beitrag folgende Informationen dazu kommentiert:
Wenn jemand versucht, auf den protokollierten Fehler während des Mailversands zuzugreifen, muss er ihn im ErrorLogModule.Logged-Ereignis abrufen. Dies könnte beispielsweise nützlich sein, um die Id des protokollierten Fehlers in die E-Mail einzufügen. Um das zu erreichen, würden Sie die Id aus dem Logged-Ereignis in den HttpContext legen und sie später im Mailing-Ereignis verwenden. Damit das funktioniert, müssten die Module so registriert sein, dass das Mailing-Ereignis nach dem Logged-Ereignis auftritt.
Ich dachte, da die httpModules zuerst ErrorLog und dann ErrorMail hinzugefügt werden, würde dies die Registrierung des Mailing-Ereignisses nach dem Logged-Ereignis erreichen. Ich nehme an, dass hier die Reihenfolge der Ereignisse gemeint ist und nicht die Reihenfolge, in der die Module angewendet werden.
Wie registriert man die Ereignisreihenfolge von HttpModules?
Ich habe den unten stehenden Code ohne Erfolg versucht. Der Code verhindert das Senden der E-Mail, aber der Fehler wird dennoch in der SQL-Tabelle protokolliert.
Web.Config:
... und ...
Und selbstverständlich sind die und ordnungsgemäß konfiguriert (ich habe sie über NuGet installiert).
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}, siehe ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);
}
Wenn ich den Code des ErrorMail_Mailing-Ereignisses in global.asax.cs wie folgt ändere, erhalte ich die E-Mail mit dem im ErrorMail_Mailing-Ereigniscode angegebenen Betreff, wie es sein sollte. Ich habe sogar versucht, einfach Session.SessionID in den Betreff zu setzen, aber das beeinträchtigt die E-Mail-Funktionalität. Dies lässt mich vermuten, dass das ErrorMail_Mailing-Ereignis keinen Zugriff auf die Session hat. Ist das korrekt?
protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
e.Mail.Subject = "Ich habe den Betreff in global.asax geändert";
}