2009-07-26 16 views
0

Im Abschnitt Page_Load() überprüfe ich auf gültige Eingaben & Wenn sie ungültig sind, übertrage ich die Anfrage auf eine benutzerdefinierte Fehlerseite.Anfrage kann nicht an die gewünschte ASP.NET-Fehlerseite übertragen werden

Währenddessen wird eine ThreadAbortException ausgelöst, die von meinem catch-Block abgefangen wird, aber asp.net überträgt die Anforderung an unbekannte Ausnahmeseite. Was mache ich falsch? Ich möchte nicht die ThreadAbortException kommen, wenn ich auf die Fehlerseite übertrage. zB:

 protected void Page_Load(object sender, EventArgs e) 
    { 

    try 
    { 
        if (String.IsNullOrEmpty(szProductName)) 
         { 
         //Product name not given. Hence cant process further. 
         Server.Transfer(Constants.ERROR_WRONG_INPUTS_ASPX); 
         } 
        else 
         { 
          //Do something..... 
         } 
    } 
    catch(Exception Ex) 
    { 

    } 

    } 

Als Abhilfe können, verwende ich jetzt:

Response.Redirect(Constants.ERROR_WRONG_INPUTS_ASPX, false); 

statt Server.Transfer dh ich das Verfahren erlauben im Hintergrund fortzusetzen, die ich & nur auf Gültigkeit überprüfen erforderlich machte dann den restlichen Code ausgeführt.

Mein Problem ist ähnlich zu: Exception Handling Application Block Exception Handler running in ASP.NET cannot call Response.End(), aber es scheint, dass es nicht beantwortet wurde.

Antwort

1

Response.Redirect löst die ThreadAbortException aus, um die aktuelle Seite abzubrechen und das Steuerelement auf die neue Seite zu übertragen. Das Hinzufügen des falschen Parameters "behebt" dieses Problem, da Response.Redirect die Verarbeitung auf der aktuellen Seite beendet, bevor die Kontrolle übertragen wird.

Ich glaube, obwohl Sie Ihren Anwendungsfluss betrachten müssen. Eine Seitenübertragung auf eine Fehlerseite aufgrund von Eingabefehlern scheint mir eine zu komplizierte Art der Eingabevalidierung zu sein. Ich denke, Sie sind besser dran mit einem Postback, das Nachrichten anzeigt, oder eine Validierung in Javascript vor der Veröffentlichung der Seite.

+0

Die Sache ist, dass der Benutzer zu meiner Seite mit einem Link kommen: http: //MyServer/MySite/Details.aspx? ProductName = FireFox. So kann ich prüfen, ob das Produkt nur gültig ist, sobald seine Anfrage auf meinen Server kommt. Wenn er den Produktnamen nicht eingibt, muss ich ihm sagen, dass er die falsche Eingabe eingegeben hat (auch bei falschem Produkt). Ich kann dem Benutzer nicht helfen, den falschen Produktnamen/keinen Namen einzugeben, da das aus meiner Hand ist. Irgendwelche Vorschläge? –

+0

Wenn es wirklich eine ungültige Situation ist, würde ich einen Fehler werfen und die Anwendungsfehlerbehandlung übernehmen lassen. Vor allem, wenn der Fehler bedeutet, dass ein Problem in der aufrufenden Anwendung vorliegt. Oder, wenn das keine Option ist, würde ich zu der aufrufenden Anwendung zurückkehren, die das Problem identifiziert. –

0

Wenn Response.End() aufgerufen wird, wird eine ThreadAbortException auftreten. Der Server.Transfer ruft Response.End() intern auf, da sofort die aktuelle Verarbeitung beendet wird und die Anforderung an die neue Seite übergeben wird, die für die Rückgabe der Informationen an den Browser verantwortlich ist.

Response.Redirect ist eleganter, da die Verarbeitung der aktuellen Anforderung abgeschlossen ist und eine 301 Redirect-Antwort an den Client zurückgegeben wird. Im Allgemeinen führt dies dazu, dass der Browser eine zweite Anfrage an den Server stellt, um die Weiterleitungs-URL anzufordern.

Sie sagen, es wird auf eine unbekannte Fehlerseite verschoben, aber ich bin mir nicht sicher warum. Machen Sie das in Ihrer Application_Error-Methode in Global.asax? Wenn der Fehler behandelt wird, sollten Sie in der Lage sein zu steuern, wohin es sich bewegt.

+0

Seine Umleitung auf eine Standard-Fehlerseite, die ich in der web.config festgelegt:

0

Ich suggest Sie loswerden dieser Versuch ... catch Block. Was erwartest du da draußen zu fangen? Wenn Sie wirklich eine außergewöhnliche Situation erwarten, die von Ihrer Implementierung abhängt, würde das weiter unten in Ihrem else Block passieren. Also solltest du es mit Versuch einpacken ... endlich da.

ASP.NET löst die ThreadAbortException aus, wenn Sie Ihre Anfrage beenden, aber sie fängt sie schließlich im Call-Stack auf, so dass Sie sie nicht selbst erfassen sollten. Wenn Sie eine andere mögliche Statusbeschädigung erwarten, lassen Sie sie einfach bis zum globalen Ausnahmebehandler propagieren. Es ist nicht dein Code, der wirft.

0

Wenn ein Produkt fehlt oder wenn sich das Produkt nicht in Ihrem Datenspeicher befindet, sollten Sie möglicherweise einen 404 (Seite nicht gefunden) zurückgeben. Dies zeigt dem Browser - und Google-Suche-Spidern! - an, dass es keine solche Seite gibt. Planen Sie SEO-freundliche URLs wie zum Beispiel: http://MyServer/MySite/Products/FireFox?

+0

Das Projekt, an dem ich arbeitete, wenn ich diese Frage hatte, ist schon lange tot. Es war sowieso eine Intranet-Website. –

Verwandte Themen