Ich arbeite an einer MVC3-Anwendung und verwende Elmah, um meine Fehlerprotokollierung zu verarbeiten. Was ich in meiner Anwendung möchte, ist die Elmah-ID auf die benutzerdefinierte Fehlerseite zu tragen, da ich einen Link zur Verfügung stellen werde, der es einem Benutzer ermöglicht, ihn spezifisch zu melden, falls es sich nach seiner Meinung wiederholen sollte.
Nun habe ich ähnliche Fragen hier gelesen und sie schlagen vor, der Datei Global.asax.cs den folgenden Code (oder einen ähnlichen Code) hinzuzufügen:
%Vor%Dies ist, was ich gerade benutze, mit der SessionID, die für zusätzliche Flexibilität sorgt, um das gespeicherte Session-Objekt einzigartig zu machen. Dies kann jedoch immer noch Probleme verursachen, wenn mehr als ein Fehler gleichzeitig (praktisch) auftritt.
Stattdessen habe ich beschlossen, an meinem eigenen HandleErrorAttribute zu arbeiten, das ungefähr so aussieht:
%Vor%Dabei ist ErrorDetail ein benutzerdefiniertes Modell, das nur die öffentlichen Eigenschaften enthält, die hier als Zeichenfolgen festgelegt werden. Diese Daten können dann im Modell für Administratoren auf einen Blick angezeigt werden und die errorId kann verwendet werden, um den Link 'Fehler melden' zu erstellen.
Meine Frage ist also, ob jemand weiß, wie man die ID nach der Zeile bekommt
%Vor%ohne das Logged-Ereignis in der Datei global.asax.cs zu verwenden?
Irgendwelche Gedanken werden sehr geschätzt.
Nach dem Lesen von Dupins Kommentaren erscheint es logisch, dass dies nicht möglich ist. Ich habe versucht, den Elmah-Quellcode zu durchsuchen und mir ein paar Alternativen ausgedacht, die es wert wären, geteilt zu werden.
Die offensichtliche Alternative ist bei meiner ursprünglichen Option, das protokollierte Ereignis zu verwenden:
%Vor%Für eine direktere Lösung ist es möglich, den Fehler manuell mit folgendem zu protokollieren:
%Vor%Die Verwendung dieses Ansatzes trifft jedoch nicht auf Ihre Filter oder Ihr E-Mail-Modul usw.
Nachdem ich ein wenig nachgedacht und ein bisschen mehr gesucht hatte, kam ich zu einem neuen Kompromiss. Ich benutze immer noch das protokollierte Ereignis, aber ich habe eine Möglichkeit gefunden, einen neuen eindeutigen Schlüssel zu erstellen, der an die Ansicht übergeben werden kann, indem ich der Ausnahme eigene Daten hinzufüge.
%Vor%Auf diese Weise kann ich die Ausnahme in meinem Ansichtsmodell übergeben, das diesen Schlüsselwert in der Datensammlung hat. Das protokollierte Ereignis wird in etwa wie folgt geändert:
%Vor%Dann in der Ansicht bekomme ich den Schlüssel vom Modell, um dann die Id aus der Session-Sammlung zu ziehen.
Vielleicht nicht sehr hilfreich, aber ich vermute, dass Sie die Fehler-ID zu diesem Zeitpunkt nicht erhalten können und Sie müssen das protokollierte Ereignis verwenden.
Wenn Sie
anrufen %Vor%Sie erhöhen nur den Fehler. Je nachdem, wie Sie ELMAH konfiguriert haben, protokollieren Sie möglicherweise den Fehler oder Sie senden einfach eine E-Mail oder einen Tweet.
Es gibt keine direkte Verbindung zwischen einem erhöhten Fehler und einer ID. Das wird nur mit der Protokollierung geschehen, wenn du dich lustig fühlst, könntest du es an mehreren Orten machen und so mehrere IDs erstellen.
Die obige Lösung funktioniert nur, wenn ein Session-Objekt vorhanden ist (Websitenszenario). Wir brauchten, dass es in einer Azure WorkerRole oder einem Konsolen / Desktop-App-Typ-Setup funktionierte. Diese Lösung funktioniert auch für das Web und speichert etwas Sitzungsspeicher. Es gibt keine perfekte Lösung, aber eine, die für uns gearbeitet Lage sein, den Fehler zu protokollieren und die gespeicherte ID abrufen und feuert eine E-Mail ist:
Für den zweiten Teil, haben wir die Umsetzung der ElmahExtension hier gegeben: Ссылка
und entfernt die folgenden Zeilen die Protokollierung hinzufügen:
%Vor%Der gesamte Anruf von unserem Client-Code sieht wie folgt aus:
%Vor%Sie möchten vielleicht, dass die Erweiterung Methode, etwas anderes nennen, wie RaiseToElmahNoStorage () oder etwas zu zeigen, dass er die Speicherkomponente wird übersprungen wird.
Tags und Links asp.net-mvc elmah