2009-07-14 12 views
1

Ich verwende das Ereignis Application_Error, um Fehler in meiner App zu erfassen und zu protokollieren. Der Fehler wird protokolliert, dann ein freundlicher Fehlerbildschirm angezeigt:ASP.NET Anwendungsfehler überschreiben 404?

In meiner web.config Ich habe:

<customErrors mode="On" defaultRedirect="GlobalError.aspx"> 
    <error statusCode="404" redirect="PageNotFound.aspx" /> 
</customErrors> 

Jedes Mal, wenn ein Benutzer eine Seite zu laden versucht, die nicht existieren, sie Rufen Sie die Seite GlobalError.aspx ab, nicht die Seite PageNotFound.aspx. Ich habe im Application_Error-Ereignis gesucht und festgestellt, dass der Response StatusCode 200 war, während der letzte Fehler des Servers "Page 'foo.aspx' wurde nicht gefunden wurde."

Was muss ich tun, damit das funktioniert?

Antwort

3

In der Application_Error-Funktion sollten Sie nur Server.Transfer, wenn der Fehler keine Seite nicht gefunden/404-Fehler ist. In diesen Fällen überlassen Sie es ASP.NET, die Umleitung mithilfe der Einstellungen in der web.config vorzunehmen.

Sie könnten herausfinden, ob es ein 404 unter Verwendung der folgenden ist:

Exception ex = Server.GetLastError(); 
if (ex.GetType() == typeof(HttpException)) 
{ 
    HttpException httpEx = (HttpException)ex; 
    if(httpEx.GetHttpCode() == 404) { 
    return; 
    } 
} 
Server.Transfer("~/error.aspx"); 
+0

Ich dachte darüber nach, aber wie ich schon sagte, auch wenn die Seite nicht gefunden wird, ist der StatusCode 200, nicht 404. –

+0

Ich habe ein Code-Snippet hinzugefügt, um zu erkennen, ob es sich um einen 404-Fehler handelt –

+0

Dies funktioniert so erwarte, aber es scheint plump, nein? Warum muss ich das erkennen? Warum funktioniert die web.config nicht so, wie ich es erwarte? –

0

Zunächst müssen Sie entscheiden, warum sie GlobalError.aspx bekommen. Sie haben uns zwei Möglichkeiten gezeigt; vielleicht gibt es mehr.

Ändern Sie den Namen eines dieser Einträge in GlobalErrorX.aspx und sehen Sie, was passiert.

+0

Wenn ich die defaulRedirect entfernen, drückt er den Benutzer auf die gleiche Stelle. Offensichtlich sind die zwei Verweise auf die Datei redundant. –

+0

Ich habe gerade festgestellt, dass das 404 bedeuten könnte, dass es die Fehlerseite nicht finden kann. Überprüfen Sie das IIS-Protokoll. –

+0

Nein, die 404-Seite wird angezeigt, wenn sie direkt geladen wird, und das Protokoll sagt foo.aspx wird nicht gefunden. Das Problem ist eigentlich mit einigen "cleveren" Benutzern. Ich benutze eine Seite namens bar.aspx. Auf der Kundenseite heißt "bar" "foo". Wenn sie bar.aspx laden, sehen sie einen großen Titel, der "Foo" sagt - es ist nur ein Unterschied in Begriffen zwischen verschiedenen Clients, die wir ähnlich wie in einem Sprachwörterbuch behandeln. Das Problem ist, dass sie versuchen, foo.aspx direkt zu laden, und erhalten einen Fehler Bildschirm, der sie denken, dass foo.aspx ist gebrochen, wenn in der Tat der Fehler bedeutet nur foo.aspx existiert nicht, wie sie denken, dass es tut . –