2010-03-02 10 views
8

Ich verwende Elmah mit ASP.NET und frage mich, wie ich benutzerdefinierte Daten, wie eine Sitzungsvariable, zu einer unbehandelten Ausnahme-E-Mail hinzufügen würde.Benutzerdefinierte Elmah YSOD-Daten

Ich habe mehrere Handler in der Global.asax-Datei ausprobiert, kann aber nicht den richtigen finden.

Antwort

4

Dafür würde ich denken, dass Sie die Elmah source ändern und neu kompilieren müssten. Es sollte nicht zu schwer zu erreichen sein. Wenn Sie in den Konstruktor der Klasse Elmah.Error schauen, wird die HttpContext übergeben, von der Sie in der Lage sein sollten, die benötigten Informationen zu erhalten, z. Session, Formularvariablen usw. Sie können benutzerdefinierte Felder der Elmah.Error Klasse für diese Daten

Ich denke, die Elmah.ErrorMailHtmlFormatter Klasse hinzufügen, wo die E-Mail aufgebaut ist, eine HtmlTextWriter verwenden, und hier können Sie Code in der RenderSummary() Methode einsetzen umfassen die benutzerdefinierte Felder, die Sie zu Elmah.Error hinzugefügt haben.

Ich weiß, es könnte ein Schmerz sein, mit der Arbeit mit der Quelle zu beginnen, aber persönlich denke ich, dass es der sauberste Weg ist, da es derzeit keine Möglichkeit für Report-/E-Mail-Vorlagen gibt und es besser ist, etwas zu verschrauben, um die Ausgabe danach zu ändern wurde generiert.

1

Andrew's Antwort hat sehr geholfen, danke. Am Ende habe ich Folgendes getan:

  1. Dem Modul ErrorMail http wurde ein OnBuilding-Ereignis hinzugefügt. Die Ereignisargumente für dieses Ereignis haben eine NameValueCollection-Eigenschaft.
  2. Ich behandelt das OnBuilding-Ereignis in global.asax.
  3. Da HttpModules nicht immer Zugriff auf den Sitzungsstatus haben, esp. Wenn die Ausnahme vor dem Laden der Sitzung auftritt, kopierte ich die Daten, die ich gemeldet haben wollte, in den HttpApplication-Cache (indiziert von sessionid).
  4. Wenn eine Ausnahme auftritt, greife ich die Daten, die ich will, aus dem Anwendungscache über die SessionID, die in der Anfrage gespeichert ist (speziell im Cookie). Aus diesen Daten erzeuge ich eine NameValueCollection und sende sie über die OnBuilding-Argumente an das httpmodul zurück.
  5. Die Daten werden dann ähnlich wie die Servervariablen wiedergegeben.