2009-09-01 11 views
5

Ich lerne ASP.NET und betrachtete QueryStrings.Warum erhalte ich eine ausgelöste Ausnahme, wenn ich Response.Redirect() ausführe?

Eines der Beispiele, die ich auf der Suche war hakt einen Knopf bis zu einem Redirect Aufruf:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //throws ThreadAbortException: "Thread was being aborted" 
      Response.Redirect("Form2.aspx"); 
     } 
     catch (Exception Ex) 
     { 
      System.Diagnostics.Debug.WriteLine(Ex.Message); 
     } 
    } 

Warum es eine Threadabort hier wirft? Ist das normal? Sollte ich etwas dagegen tun? Ausnahmen sind im Allgemeinen keine gute Sache, also war ich alarmiert, als ich das sah.

+0

http://stackoverflow.com/questions/1063625/is-there -etwas-das-verhindert-response-redirect-to-work-inside-try-catch-block –

Antwort

12

Dies ist von Entwurf. Dieses KB article beschreibt das Verhalten (auch für die Request.End() und Server.Transfer() Methoden).

Für Response.Redirect() gibt es eine Überlastung:

Response.Redirect(String url, bool endResponse) 

Wenn Sie passieren EndResponse = false, dann wird die Ausnahme nicht ausgelöst (aber die Laufzeit wird auch weiterhin die aktuelle Anfrage ist). Wenn endResponse = true (oder wenn Sie die Überladung ohne das Bool-Argument verwenden) wird die Ausnahme ausgelöst und die aktuelle Anforderung wird sofort beendet.

+2

Ich bezweifle, dass es tatsächlich "von Design" ist, vielleicht eine unglückliche Konsequenz ihres Designs? ;) – MedicineMan

+2

"Durch Design" bedeutet nicht, dass das gewählte Design perfekt ist ;-) – M4N

3

Das ist normal. Server.Transfer() löst auch die gleiche Ausnahme aus.

Dies liegt daran, dass beide Methoden intern Response.End() aufrufen, wodurch die aktuelle Anforderungsverarbeitung sofort abgebrochen wird. Rick Strahl hat eine pretty good blog post, die analysiert, warum es so gut wie nichts gibt, was Sie tun können, um diese Ausnahmen zu vermeiden.

1

Ich glaube, dass Sie den Anweisungen in diesem KB-Artikel folgen müssen. Response.Redirect ruft Response.End() auf, es sei denn, Sie haben die speziell erstellte Überladung verwendet, um dieses Verhalten zu vermeiden. Sobald die Antwort beendet ist, können keine weiteren Operationen stattfinden, daher der TA exc.

http://support.microsoft.com/kb/312629

2

Es ist normal, dass es ist, was passieren gemeint ist. Wenn die Antwort auf eine Umleitung festgelegt wurde, erwartet ASP.NET, dass Sie vollständig mit der Anforderung fertig sind. Es bricht den Thread als eine Möglichkeit ab, eine andere Verarbeitung zu verhindern (im Grunde ruft es Response.End für Sie auf, und das löst die Ausnahme aus).

Es scheint mir, dass es ein bisschen ein Missbrauch von Ausnahmen ist, aber so funktioniert es. Sie können die Überladung verwenden, die einen zweiten Parameter hat (und false übergeben), um dies zu verhindern, wenn Sie möchten - aber wenn ja, stellen Sie sicher, dass nichts anderes versucht, in die Antwort zu schreiben!

0

Aufruf die Überlastung von Redirect(), die nur eine URL nimmt führt auch zu einem Aufruf an Response.End() - die eine Threadabort Ausnahme auslöst, um sicherzustellen, dass kein anderer Code nach der Umleitung auf Ihrer Seite/UC wird ausgeführt.

Sie sollten diese Ausnahme nicht fangen ..Sie sollten es entweder in Ihrem Code ignorieren oder die Überladung von Redirect() verwenden, die einen booleschen Wert annimmt, der angibt, ob die Verarbeitung der Anfrage nach der Weiterleitung fortgesetzt werden soll.

2

Response.Redirect ruft Response.End intern, so dass es die Ausnahme auslöst, verwenden Sie stattdessen:

Response.Redirect(url, false); 
0

Ja. Ich code ein Exit Sub nach denen, aber ich weiß, dass es nicht erreicht wird.

Ich nehme an, wenn Sie wollten, könnten Sie die Ausnahme essen und weitere Sachen nach, aber ich würde es nicht empfehlen.

0

Bereits eine Reihe von vernünftigen Antworten hier. Ein weiterer Punkt, den es zu beachten gilt. Die Thread-Abbruch-Ausnahme ist eine der seltenen Ausnahmen, die Sie abfangen und gegen sie codieren können, die Sie jedoch nicht unterdrücken können. Es wird am Ende jeder try/catch/finally-Blockierung automatisch neu ausgelöst, unabhängig davon, was Sie tun.

Und wenn Sie sich entscheiden, mit dieser Ausnahme zu leben, sollten Sie sicherstellen, dass Ihre Gesundheitsüberwachung dies ermöglicht und nicht als ein Problem meldet, so dass Sie nicht vor einer Reihe von nicht-technischen stecken Manager versuchen zu erklären, warum Ihre Website so viele Thread-Abbruch-Ausnahmen verursacht. (Ich hatte einen Manager davon überzeugt, dass all diese Gewindeabtreibungen ein Durcheinander hinterließen, was natürlich das komplette Gegenteil der Absicht des Gewindeabbruchs war.)

Verwandte Themen