2009-02-27 9 views
0

Diese Frage steht im Zusammenhang mit Handle URI hacking gracefully in ASP.NET insofern, als es auch darum geht, Ausnahmen während eines ASP.NET-Anforderungslebenszyklus am besten zu behandeln. Ich habe einen Weg gefunden, die meisten Ausnahmen elegant zu behandeln, aber dann habe ich festgestellt, dass einige Ausnahmen so spät in der Anfrage auftreten, dass es keine Möglichkeit gibt, Dinge wie Server.Transfer zu tun, um die gesamte Logik der Fehlerpräsentation in eine eigene Seite zu packen.Behandeln von Ausnahmen während eines ASP.NET-Anforderungslebenszyklus

Also, ich muss die Ausnahme innerhalb der Application_Error Veranstaltung statt, und tun Response.Write s und was nicht. Es ist hässlich. Ich verstehe, dass der Antwortstream unter bestimmten Umständen bereits geleert worden sein könnte, daher ist die Übertragung der Anfrage keine wirkliche Option. Ich möchte fragen, ob es jemanden gibt, der eine elegante Lösung für dieses Problem gefunden hat?

Auch ich finde es schwierig zu wissen, wann ich die Ausnahme anmutig behandeln kann, indem ich die Anfrage auf eine andere Seite übertrage und nicht. Was ist der beste Weg, um herauszufinden, wo im Anforderungslebenszyklus wir uns befinden, wenn eine Ausnahme auftritt? Wenn es beim Laden und Rendern einer Seite auftritt, kann Page_Error damit umgehen, und ich hatte noch kein Problem Server.Transfer dort zu tun. Aber wenn die Ausnahme entweder zu früh oder zu spät für Page_Error auftritt, um sie zu fangen, und es Blasen zu Application_Error, was tue ich, um zu wissen, ob es früh oder spät ist?

Wenn es im Lebenszyklus spät ist, werde es wahrscheinlich direkt zu tun habe Response.Write von Application_Error, aber wenn es früh kann ich Server.Transfer tun. Das Problem ist, dass der Versuch, Server.Transfer zu tun, selbst eine Ausnahme verursachen wird, wenn es auch in der Anforderung ist, es zu tun.

Also, gibt es eine globale Aufzählung oder etwas Ähnliches, das anzeigt, ob es zu spät ist, kreative Sachen mit der Antwort zu machen oder nicht?

Antwort

2

Ich habe diesen Ansatz verwendet, um alle Fehler abzufangen erzeugt, entweder in Web-Steuerelemente oder Seiten. Sie müssen nur von einer Basisklasse erben (eine für Seiten und eine für Benutzersteuerelemente), jede Seite oder Benutzersteuerung kann ihre eigene HandleException-Methode implementieren und alles tun, was sie tun muss. Voll Code hier:

Transparent generic exception handling for asp.net/MOSS2007 (with code)

0

Ich denke, mein Rat für diese für die Fehler mit WMI Event Anbieter ASP.NET Health Monitoring wäre zu verwenden:

Hier eine ist, wie man.

http://msdn.microsoft.com/en-us/library/ms178713.aspx

this helps:

Andrew

+0

Hallo, und danke für den Vorschlag. Eine externe Konsole-Anwendung wird nicht wirklich helfen, da, was ich will, ist nicht nur den Fehler zu fangen (was ich schon ziemlich gut), aber eine freundliche Fehlermeldung auch anzeigen. –

+0

Verwenden Sie die benutzerdefinierten Fehlerseiten? Auf diese Weise können Sie benutzerdefinierte Informationen basierend auf einem der HTTP-Statuscodes anzeigen, die basierend auf dem Ergebnis einer Anfrage ausgelöst werden. –

+0

ASP.NET leitet alle Anfragen an die Fehlerseiten um (anstatt zum Beispiel Server.Transfer zu machen), das ist also unbrauchbar. –

0

Ich schlage vor, dass Sie asp.net Konfiguration verwenden, um eine allgemeine Fehlerseite für die nicht behandelte Ausnahmen zu haben. Von der Probe web.config

<!-- 
     The <customErrors> section enables configuration 
     of what to do if/when an unhandled error occurs 
     during the execution of a request. Specifically, 
     it enables developers to configure html error pages 
     to be displayed in place of a error stack trace. 

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> 
     <error statusCode="403" redirect="NoAccess.htm" /> 
     <error statusCode="404" redirect="FileNotFound.htm" /> 
    </customErrors> 
    --> 

Auf den gesamten Handler, nur die Ausnahme protokollieren, und ASP.net tun die Umleitung.

Wenn Sie immer noch mit Ihrem Kundenansatz fortfahren möchten, schlage ich vor, Sie betrachten die verfügbaren asp.net-Quelle und überprüfen, wie es das tut.

+1

Die benutzerdefinierten Fehler von ASP.NET sind absolut nutzlos, da sie den Benutzer (über 301 oder 302 Antwortcodes) physisch an eine neue URL weiterleiten. Grundlegendes RESTful-Design und gesunder Menschenverstand besagt, dass die URL dieselbe sein sollte, um widerzuspiegeln, welche Ressource fehlgeschlagen ist. Umleitung bricht das komplett ab. –

Verwandte Themen