2011-01-04 13 views
6

Ausführen der Zeile:
Response.Redirect Ausnahme

Response.Redirect("Whateva.aspx", true);

Ergebnisse in:

 
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll 
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code 

Die Ausnahme wegen der "wahren" Teil ist, sagen sie sofort die aktuelle Anforderung zu beenden.

Soll das so sein?
Wenn wir bedenken:

  • Ausnahmen im Allgemeinen schwer betrachtet werden, und oft der Grund, den Antrag früh für die Beendigung ist die Verarbeitung der Rest der Seite zu vermeiden.
  • In der Leistungsüberwachung werden Ausnahmen angezeigt. Daher wird bei der Überwachung der Lösung eine falsche Anzahl von Ausnahmen angezeigt.

Gibt es einen alternativen Weg, um das gleiche zu erreichen?

+0

Ähnliche Frage: http://StackOverflow.com/Questions/2777105/ –

Antwort

6

Sie haben Recht damit, dass der Entwickler das Erhöhen (und Einfangen) von Ausnahmen vermeiden sollte, da die Ausführungslaufzeit Zeit und Speicher verbraucht, um die Informationen über die bestimmte Ausnahme zu sammeln. Stattdessen sollte er (oder sie) sie einfach nicht zulassen (wenn es möglich ist).

In Bezug auf die Response.Redirect: Dieses Verhalten ist "By-Design", aber Sie möchten möglicherweise eine bekannte Problemumgehung verwenden. Bitte lesen Sie this KB article.

- Pavel

+0

der KB-Artikel, auf den verwiesen wird, ist jetzt leer. –

+0

@EvoD Nicht sicher, ich verstehe, der Link funktioniert und zeigt immer noch auf den richtigen KB-Artikel. – volpav

+0

Hrmmm, mein Fehler. Es erscheint jetzt für mich. Es tut uns leid. –

6

Ein Ansatz, den ich nehme in der Regel in diesem Szenario die Antwort während der Reaktion auf nicht am Ende ist, aber es sofort mit einer return (oder anderen Flusskontrolle) zu folgen. Etwas wie folgt aus:

Response.Redirect("Whateva.aspx", false); 
return; 

Dies hängt davon ab, wo die Umleitung in Ihrer Logik Fluss nimmt, natürlich. Wie auch immer Sie es handhaben wollen, ist in Ordnung. Aber die Idee ist, dass, wenn Sie die Antwort auf dem Redirect sowieso beenden möchten, das Beenden der fraglichen Methode über eine return nicht ausgeschlossen ist.

Eine Herangehensweise, die ich oft gesehen habe, und es sollte selbstverständlich sein, dies zu vermeiden, aber der Vollständigkeit halber werde ich es trotzdem sagen (man weiß nie, wer darüber stolpern kann) Frage später über Google, etc.), ist die Ausnahme zu fangen und zu schlucken:

try 
{ 
    Response.Redirect("Whateva.aspx", true); 
} 
catch (Exception ex) 
{ 
    // do nothing 
} 

Dies sollte natürlich nicht getan werden, für eine Reihe von Gründen. Wie ich Ihrer Beschreibung der Ausnahmen entnehmen konnte, wissen Sie zweifellos bereits, dass dies eine schlechte Praxis wäre. Aber wie gesagt, es lohnt sich, diese Tatsache in der Antwort zu erwähnen.

0

, um dieses Problem zu umgehen, eine der folgenden Methoden:

Für Response.End, rufen Sie das HttpContext.Current.ApplicationInstance.CompleteRequest Verfahren anstelle von Response.End die Codeausführung auf die Application_EndRequest zu umgehen Veranstaltung.

Für Antwort.Umleiten Sie, verwenden Sie eine Überladung, Response.Redirect (String url, bool endResponse), die false für den Parameter endResponse übergeben, um den internen Aufruf von Response.End zu unterdrücken.

Zum Beispiel: Response.Redirect ("nextpage.aspx", false);

Wenn Sie diese Problemumgehung verwenden, wird der Code ausgeführt, der Response.Redirect folgt.

Verwenden Sie für Server.Transfer stattdessen die Server.Execute-Methode.

aus: http://support.microsoft.com/kb/312629/en-us

Same Link von Volpav geschrieben.

Grüße.