4 Stimmen

Wie füge ich die SQL ELMAH_Error.ErrorID dem ELMAH-Fehler-E-Mail-Betreff hinzu?

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";
}

5voto

JustinP8 Punkte 1333

Die Antwort war unglaublich einfach. Das ErrorMailEventsArgs.Error-Objekt enthält die Sitzungsinformationen zum Zeitpunkt der Ausnahme. Das ErrorMail_Mailing-Ereignis hat keinen Zugriff auf den Sitzungskontext. Die Lösung ist also so einfach wie das Abrufen Ihrer Variable aus den 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}, siehe ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);
}

Außerdem, indem Sie den ElmahId im ErrorLog_Logged-Ereignis in die Sitzung einfügen, wenn Ihr ErrorMail-Handler nach ErrorLog registriert ist (durch Hinzufügen von ErrorLog in die web.config zuerst), wird diese Sitzungsvariable im Standard-ELMAH-Fehler-E-Mail im Abschnitt Sitzungsvariablen enthalten sein.

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

Update: Atif Aziz hat darauf hingewiesen, dass Errors.SessionVariables nicht im originalen ELMAH-Quellcode enthalten ist, sondern in einem Patch. Hier ist meine packages.config:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X