2009-03-11 9 views
4

Ich möchte eine benutzerdefinierte Fehlerseite erstellen, um alle nicht behandelten Ausnahmen zu behandeln.Wie erstelle ich eine detaillierte Fehlerseite?

Ich möchte es von der Application_Error(object sender, EventArgs e) Methode in Global.asax.cs umleiten. Wie kann ich in der Ausnahme, die den Anwendungsfehler wirft, detaillierte Informationen anzeigen?

Antwort

3

Ich habe das gleiche getan, worüber Sie sprechen. Ich habe eine ErrorPage erstellt, die Informationen für den Benutzer anzeigt. Ich habe auch eine Funktion erstellt, die die Fehlerinformationen in die Ereignisprotokolle schreibt ...

Für die Seite, das ist, was ich tue. Legen Sie einfach die Etiketten dort irgendwo ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 
    this.lblMessage.Text = ex.Message; 
    this.lblSource.Text = ex.Source; 
    this.lblStackTrace.Text = ex.StackTrace; 
    if (AppProperties.AppEnv != AppEnvironment.PROD) 
    { 
     this.ErrorDetails.Visible = true; 
    } 
    else 
    { 
     this.ErrorDetails.Visible = false; 
    } 
    Utility.LogError(); 
    Server.ClearError(); 
} 

Dies ist, was die LogError Funktion sieht aus wie ...

public static void LogError() 
{ 
    LogError(HttpContext.Current.Server.GetLastError().GetBaseException()); 
} 

public static void LogError(Exception ex) 
{ 
    EventLog log = new EventLog(); 
    if (ex != null) 
    { 
     log.Source = ConfigurationManager.AppSettings["EventLog"].ToString(); 
     StringBuilder sErrorMessage = new StringBuilder(); 
     if (HttpContext.Current.Request != null && HttpContext.Current.Request.Url != null) 
     { 
      sErrorMessage.Append(HttpContext.Current.Request.Url.ToString() + System.Environment.NewLine); 
     } 
     sErrorMessage.Append(ex.ToString()); 
     log.WriteEntry(sErrorMessage.ToString(), EventLogEntryType.Error); 
    } 
} 
+0

Sollte ich denken, dass AppProperties und AppEnvironment eine benutzerdefinierte statische Klassen sind? Danke für die Antworten. – eKek0

+0

Ja, tut mir leid ... AppProperties ist eine statische Klasse, die einige verschiedene Dinge wie meine Betriebsumgebung enthält. Ich zeige/verstecke Informationen basierend auf der Umgebung ... – RSolberg

0

Sie können Server.GetLastError() verwenden, um die von Ihrer Anwendung ausgelöste Ausnahme zu erhalten.

0

In Ihrer Seite, so etwas tun:

ErrorLabel.Text = Server.GetLastError(); 

Dies setzt voraus, C#. Sie können dann vom applicationError-Ereignis der global.asax-Datei umleiten. Es gibt andere Möglichkeiten, dies zu behandeln, und ich empfehle nicht, die Ausnahmebedingungsnachricht zu verwenden, um den Benutzer anzuzeigen.

1

Sie können die letzte Ausnahme von Server.GetLastError get(). Sobald Sie den Fehler behoben haben, können Sie ihn löschen, indem Sie Server.ClearError() aufrufen.

Übrigens gilt es als schlechte Praxis, zu viel zu zeigen, dass der Endbenutzer eine Sicherheitslücke darstellen kann. Seien Sie gewarnt, wenn Sie einen 500 HTTP-Fehlercode umleiten und nicht zurückgeben, werden verschiedene Bots nicht erkennen, dass sie einen Absturz verursachen und die gleichen fehlerhaften Anfragen auf Ihrer Site ausführen. Stellen Sie sicher, dass Sie Server.Transfer() anstelle von Response.Redirect() verwenden und Response.StatusCode = 500 setzen.

-1

Es ist fast immer eine schlechte Idee, den Endbenutzern detaillierte Fehlerinformationen anzuzeigen. Sie könnten am Ende alle möglichen ungeeigneten Informationen preisgeben: Dateinamen, Datenbankanmeldeinformationen, Implementierungsdetails usw. Melden Sie die Ausnahme an einem sicheren Ort (Protokolldatei, Datenbank usw.), aber zeigen Sie sie dem Benutzer nicht an.