Ich möchte ELMAH zum ersten Mal einsetzen, habe aber eine Anforderung, die erfüllt werden muss, und ich bin mir nicht sicher, wie ich sie erfüllen kann...
Im Grunde werde ich ELMAH konfigurieren, um unter asp.net MVC zu arbeiten und es zu erhalten, um Fehler in der Datenbank zu protokollieren, wenn sie auftreten. Darüber hinaus werde ich mit customErrors, um den Benutzer auf eine freundliche Nachricht Seite zu leiten, wenn ein Fehler auftritt. Ziemlich Standard Zeug...
Die Anforderung ist, dass ich auf dieser benutzerdefinierten Fehlerseite ein Formular habe, das es dem Benutzer ermöglicht, zusätzliche Informationen anzugeben, wenn er dies wünscht. Das Problem besteht nun darin, dass der Fehler zu diesem Zeitpunkt bereits protokolliert ist und ich den protokollierten Fehler mit dem Feedback des Benutzers verknüpfen muss.
Normalerweise würde ich, wenn ich meine eigene benutzerdefinierte Implementierung verwenden würde, nach der Protokollierung des Fehlers die ID des Fehlers an die benutzerdefinierte Fehlerseite weitergeben, damit eine Zuordnung vorgenommen werden kann. Aber aufgrund der Art und Weise, wie ELMAH funktioniert, glaube ich nicht, dass dies wirklich möglich ist.
Daher habe ich mich gefragt, wie die Leute denken, dass man dies tun könnte....
Prost
UPDATE:
Meine Lösung für dieses Problem lautet 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; }
}
}
Wenn dann der Fehler auftritt, habe ich in meiner Global.asax etwas wie dieses:
public void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
var item = new UserCurrentConextUsingWebContext();
item.StoredException = args.Entry.Error.Exception;
item.StoredExceptionId = args.Entry.Id;
}
Wo auch immer Sie sich später befinden, können Sie die Details abrufen, indem Sie
var item = new UserCurrentConextUsingWebContext();
var error = item.StoredException;
var errorId = item.StoredExceptionId;
item.StoredException = null;
item.StoredExceptionId = null;
Beachten Sie, dass dies nicht zu 100 % perfekt ist, da es möglich ist, dass dieselbe IP mehrere Anfragen mit Fehlern zur gleichen Zeit hat. Aber die Wahrscheinlichkeit, dass das passiert, ist gering. Außerdem ist diese Lösung unabhängig von der Sitzung, was in unserem Fall wichtig ist, da einige Fehler auch dazu führen können, dass Sitzungen beendet werden usw. Daher hat sich dieser Ansatz für uns bewährt.