2014-01-11 20 views
12

Wir unsere eigene Fehlerseiten, wie unten für Ausnahmen von ASP.NET geworfen konfiguriert haben:Wie wird eine benutzerdefinierte Fehlerseite angezeigt, wenn Ausnahmen für die Anforderungsüberprüfung ausgelöst werden?

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="400" redirect="~/400.aspx"/> 
    <error statusCode="404" redirect="~/404.aspx"/> 
    <error statusCode="500" redirect="~/500.aspx"/> 
</customErrors> 

Einstellung redirectMode="ResponseRewrite" wichtig ist, da es die URL (glaubt nicht ändern wird sichergestellt, ich ASP.NET eine Server.Transfer führt statt Response.Redirect).

Leider funktioniert dies nicht für Request Validation Errors. Wenn beispielsweise benutzerdefinierte Fehler aktiviert sind, wenn ich zu /some/page/<script> navigiere, wird die Anfragevalidierung von ASP.NET gestartet und eine HttpException wird ausgelöst. Statt jedoch meine benutzerdefinierte Fehlerseite anzuzeigen, erhalte ich die folgende Meldung:

Serverfehler in '/' Anwendung.

Runtime Error

Beschreibung: Eine Ausnahme ist aufgetreten während der Bearbeitung Ihrer Anfrage. Darüber hinaus trat eine weitere Ausnahme beim Ausführen der benutzerdefinierten Fehlerseite für die erste Ausnahme auf. Die Anfrage wurde beendet.

Warum kann ASP.NET meine benutzerdefinierte Fehlerseite in diesem Szenario nicht anzeigen? Es gibt keinen Code in der Fehlerseite, nur HTML, also weiß ich, dass die Fehlerseite selbst keine Ausnahmen auslöst.

Auch wenn ich den Fehler selbst in Application_Error und eine Ausgabe Server.Transfer erstelle es funktioniert gut, ich bin gespannt, was ASP.NET tut unter den Abdeckungen.

Wenn wir selbst damit umgehen wollen, gibt es dann eine bessere Lösung?

protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError() as HttpException; 
    if (ex != null 
     && ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client") 
     && HttpContext.Current.IsCustomErrorEnabled) 
    { 
     Server.Transfer("400.aspx"); 
    } 
} 
+0

Sind Sie sicher, dass der Validierungsfehler 400,404 oder 500 Fehler auslöst? vielleicht ein anderer Fehlercode, der nicht von deiner Config bearbeitet wird – David

+0

Hast du das herausgefunden? – Animesh

Antwort

2

Um sicher zu sein, dass Sie alle Fehlercodes nicht auslassen, die in Ihnen Sie Standardfehlerseite hinzufügen können WebApp auftreten könnten:

<customErrors mode="On" defaultRedirect="Error.aspx" /> 

Und wenn Sie nur RequestValidationErrors fangen wollen, als Sie damit umgehen kann in Ihrer global.asax-Datei:

void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (ex is HttpRequestValidationException) 
    { 
     Server.ClearError(); 
     Response.Redirect("RequestValidationError.aspx", false); 
    } 
} 
0

ein Problem, die Einstellungen custom in einer Konfigurationsdatei mit ist, dass die Umleitung erzeugt eine Umleitung HTTP-Statuscode führen kann (300 seri es) an den Client/Browser zurückgegeben werden, wenn Sie wirklich einen Serverfehler HTTP-Statuscode (500-Serie) oder einen Client-Fehler HTTP-Statuscode (400-Serie) senden möchten.

Um den von Ihrer Website zurückgegebenen HTTP-Statuscode zu untersuchen, können Sie die Anzeige "Weitere Tools> Entwicklertools" von Chrome mit der ausgewählten Registerkarte "Netzwerk" verwenden. Dann können Sie den HTTP-Statuscode, der von Ihrem Webserver zurückgegeben wird, an den Client/Browser zurückverfolgen. Wenn eine ungültige E-Mail-Adresse eingegeben wurde, sollte ein Client-Fehlerstatus zurückgegeben werden (HTTP-Status 400-Serie) und kein Umleitungsstatuscode (300-Serie).

Der Fehler "Runtime time", der mit Ihrer Frage aufgelistet wurde, wurde möglicherweise durch eine nicht behandelte Validierungsbedingung verursacht, die einen Serverfehler verursachte. Solche Fehler erfordern weitere Aufmerksamkeit, sollten jedoch einen Serverfehlercode (500-Serie) in der HTTP-Antwort zurückgeben.

Webserverfehler werden auf zwei Ebenen behandelt.Eine Ebene befindet sich in der Seiteninhaltsanzeige, die andere in den zurückgegebenen HTTP-Statuscodes. Idealerweise stimmen diese überein.

0
void Application_Error(object sender, EventArgs e) { 
    Exception Ex = Server.GetLastError; 
    Logger.AddNewLog(Logger.LogType.ErrorLog, sender.ToString, "Error", (Ex.Message 
        + (Environment.NewLine + Ex.StackTrace))); 
    Server.ClearError(); 
    Response.Redirect("/Error"); 
} 
0

Platz existingResponse="Replace" und subStatusCode="-1" im httpErrors Abschnitt Ihrer web.config.

Die Seite wird nun als 400 Fehler angezeigt und zeigt Ihre Fehlerseite an.

in Ihrer Anwendung
enter image description here

In web.config enter image description here

Keine Notwendigkeit customErrors Abschnitt

enter image description here
* # 8 zu verwenden, ist eine Seite, wo ich eine 500 erzeugen Fehler absichtlich.

Verwandte Themen