2010-03-09 6 views
10

Ich weiß, dass ASP.NET MVC Fehlerfilter-Attribut hat, um den angegebenen Fehlertyp zu behandeln. Diese Funktion kann jedoch keinen Fehler erkennen, der beim Start der Anwendung auftritt. Daher muss ich der "Application_Error" -Methode etwas Code hinzufügen, um diesen Fehler wie den folgenden Code zu behandeln.Wie ASP.NET-Anwendungsfehler behandelt wird, der beim Start der Anwendung auftritt, und Fehler in der MVC-Ansicht anzeigen und anzeigen?

public void Application_Error(object sender, EventArgs e) 
{ 
    // At this point we have information about the error 
    var ctx = HttpContext.Current; 

    var exception = ctx.Server.GetLastError(); 

    var errorInfo = 
     "<br>Offending URL: " + ctx.Request.Url + 
     "<br>Source: " + exception.Source + 
     "<br>Message: " + exception.Message + 
     "<br>Stack trace: " + exception.StackTrace; 

    ctx.Response.Write(errorInfo); 

    Server.ClearError(); 
} 

Obwohl, wird dieser Code funktioniert gut, wenn normale Anwendungsfehler wie Fehler auftritt, die in Ansichtsseite auftritt. Trotzdem funktioniert es nicht, wenn beim Starten der Anwendung ein Fehler auftritt, da die Request- und Response-Objekte immer null sind.

Als nächstes versuche ich, diese Frage zu lösen, indem ich Standardumleitung in benutzerdefinierten Fehlern wie dem folgenden Code einstelle.

<customErrors mode="On" defaultRedirect="Scripts/ApplicationError.htm"></customErrors> 

Leider ist es nicht funktioniert, weil, wenn die Anwendung umgeleiteten Anfrage erhalten, es versuchen Anwendung zu starten wieder und es Ausnahme wieder werfen.

Wie löst man dieses Problem? Alternativ haben Sie eine andere Idee für die Behandlung dieses Fehlers.

Danke,

PS. Der Hauptgrund für das Erstellen dieses Handlers, weil ich einen Fehler anzeigen möchte, wenn die Anwendung keine Verbindung zu einem anderen Dienst wie der Datenbank herstellen kann, um Daten beim Start der Anwendung zwischenzuspeichern.

Antwort

19

Der Grund, warum Request und Response Objekte null in Ihrem Application_Error Ereignisse ist, weil das Application_Start Ereignis nicht mit einem Benutzer zugeordnet ist, damit Sie nicht von ihrem umleiten. Nur die integrierten Objekte Application und Server sind verfügbar. Das Verweisen auf die Objekte Session, Request oder Response würde zu einem Fehler führen.

Eine Problemumgehung besteht darin, try/catch zu verwenden und im catch Block den Fehler zu protokollieren und eine globale Variable festzulegen, die angibt, dass beim Start der Anwendung ein Fehler aufgetreten ist. Später Application_BeginRequest können Sie diese Variable überprüfen und entsprechend umleiten.

+0

Ich verwende, um Code zu erstellen, der mit Ihrer Antwort ähnlich ist. Ich lösche einen Fehler, wenn ein Anwendungsfehler ausgelöst wird, und speichere den letzten Fehler in der öffentlichen statischen Variable. Danach habe ich einen Aktionsfilter, der diese Variable überprüft und Fehler anzeigt, wenn sie verfügbar ist. Allerdings mag ich diese Idee nicht. Weil es möglich ist, eine Fehlerseite für andere Anfragen anzuzeigen, die diesen Fehler verursachen. –

+2

Es sollte keine weiteren Anfragen geben. Wenn Ihre Anwendung bei der Initialisierung fehlschlägt, sehe ich nicht, wie sie Anfragen bearbeiten würde, wenn sie sich in einem fehlerhaften Zustand befinden. Die einzige Problemumgehung wäre, das Problem zu beheben und die Anwendung neu zu starten. –

+0

Ich stimme zu, dass nachfolgende Anforderungen nicht auftreten sollten, wenn ein Startfehler auftritt, also benötigen Sie einen try/catch um den gesamten Application_Start herum. Wenn Sie in BeginRequest nach Ihrer Startup-Ausnahme suchen, gibt es eine MVC-freundlichere Methode zum Umleiten als Response.Redirect? Meine leitet auf eine Weise um, die Firefox sagt, wird nicht enden. Gibt es eine Möglichkeit, um zu einer Aktion umzuleiten, die die Ausnahme wie Error.Startup (ex) verwendet. – flipdoubt

Verwandte Themen