2010-01-26 5 views
8

Ich betrachte mit ELMAH zum ersten Mal zu sammeln, sondern haben eine Anforderung, die erfüllt werden muss, dass ich nicht sicher bin, wie über das Erreichen gehen ...ELMAH - Verwenden von benutzerdefinierten Fehlerseite Benutzer-Feedback

Im Grunde werde ich ELMAH konfigurieren, um unter asp.net MVC zu arbeiten und es zu veranlassen, Fehler in der Datenbank zu protokollieren, wenn sie auftreten. Obendrein benutze ich customErrors, um den Benutzer auf eine freundliche Nachrichtenseite zu lenken, wenn ein Fehler auftritt. Ziemlich Standard-Zeug ...

Die Voraussetzung ist, dass auf dieser benutzerdefinierten Fehlerseite habe ich ein Formular, mit dem Benutzer zusätzliche Informationen bereitstellen können, wenn sie möchten. Jetzt entsteht das Problem aufgrund der Tatsache, dass zu diesem Zeitpunkt der Fehler bereits protokolliert ist und ich den ausgelagerten Fehler mit der Benutzerrückmeldung verknüpfen muss.

Normalerweise, wenn ich meine eigene benutzerdefinierte Implementierung verwendete, nachdem ich den Fehler protokolliert habe, würde ich die ID des Fehlers auf die benutzerdefinierte Fehlerseite übergeben, so dass eine Zuordnung vorgenommen werden kann. Aber wegen der Art, wie ELMAH funktioniert, glaube ich nicht, dass das Gleiche möglich ist.

Daher ich mich gefragt, wie die Leute gedacht, dass man über das tun dies gehen könnte ....

Prost

UPDATE:

Meine Lösung für das Problem wie folgt:

public class UserCurrentConextUsingWebContext : IUserCurrentConext 
{ 
    private const string _StoredExceptionName = "System.StoredException."; 
    private const string _StoredExceptionIdName = "System.StoredExceptionId."; 

    public virtual string UniqueAddress 
    { 
     get { return HttpContext.Current.Request.UserHostAddress; } 
    } 

    public Exception StoredException 
    { 
     get { return HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] as Exception; } 
     set { HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] = value; } 
    } 

    public string StoredExceptionId 
    { 
     get { return HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] as string; } 
     set { HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] = value; } 
    } 
} 

Dann, wenn der Fehler auftritt, habe ich so etwas in meinem Global.asax:

public void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    var item = new UserCurrentConextUsingWebContext(); 
    item.StoredException = args.Entry.Error.Exception; 
    item.StoredExceptionId = args.Entry.Id; 
} 

Dann, wo immer Sie später sind, können Sie durch die Details herausziehen

var item = new UserCurrentConextUsingWebContext(); 
    var error = item.StoredException; 
    var errorId = item.StoredExceptionId; 
    item.StoredException = null; 
    item.StoredExceptionId = null; 

Hinweis ist dies nicht zu 100% perfekt als möglich, dass die gleiche IP mehrere Anfragen zu haben Fehler gleichzeitig haben Zeit. Aber die Wahrscheinlichkeit, dass das passiert, ist gering. Und diese Lösung ist unabhängig von der Sitzung, was in unserem Fall wichtig ist, auch einige Fehler können dazu führen, dass Sitzungen beendet werden usw. Daher hat sich dieser Ansatz für uns bewährt.

+0

Hast du dies funktioniert? Ich habe das gleiche Problem. Ich folgte Atifs Ratschlag, aber wenn ich HttpContext.Items für die Elmah-ID auf meiner benutzerdefinierten Fehlerseite anspreche, erhalte ich eine Null-Referenz-Ausnahme. –

+0

@Ronnie Overby: Siehe oben Bearbeiten. –

+0

Danke. Ich habe überlegt, so etwas zu machen, aber ich benutze eine Kombination aus Cookie und ipdress als Identifikator. Letztendlich habe ich das nur getan: http://stackoverflow.com/questions/2885487/problem-passing-elmah-log-id-to-custom-error-page-in-asp-net/2906440#2906440 –

Antwort

8

Die ErrorLogModule in ELMAH (Version 1.1 als dies geschrieben wurde) ein Logged Fall, dass Sie in Global.asax handhaben können und die Sie Details kommunizieren können, sagen über HttpContext.Items Sammlung, um Ihre benutzerdefinierte Fehlerseite. Wenn Sie die ErrorLogModule unter dem Namen ErrorLog in web.config dann Ihren Event-Handler in Global.asax registriert werden wie folgt aussehen:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    var id = args.Entry.Id 
    // ... 
} 
+0

Prost, vielen Dank dafür. –