2009-08-09 14 views

risposta

27

Questo non può essere una risposta completa, ma da quello che ho visto ...

Response .Redirect, in effetti, causa il blocco del codice eseguendo un System.Threading.ThreadAbortException.

È possibile verificarlo da soli impostando la gestione degli errori globali in Global.Asax e testando Response.Redirect.

EDIT

e qui è un link alla documentazione che supporta la mia risposta:

reindirizzare le chiamate Fine che solleva un'eccezione ThreadAbortException su completamento.

HttpResponse.Redirect Method (String, Boolean) (System.Web)

1

la mia comprensione è che dopo l'emissione di un Response.Redirect(), seguente codice non verrà eseguito. Se ci pensi, avrebbe senso non eseguirlo. In pratica stai dicendo al tuo codice che vuoi andare da qualche altra parte.

Esempio: Pensate ad ordinare un pasto di valore al McDonalds. Dopo averlo ordinato e iniziato a riempire il tuo drink, cambi idea e dici "sai cosa, dimentica il mio ordine. Sto andando a Reindirizza da solo a Wendy." A quel punto, smetteranno di preparare patatine e hamburger perché, beh ... hai deciso di andare da qualche altra parte, cioè reindirizzare la risposta.

+1

Mi piace l'uso di un esempio del mondo reale. – David

+3

Direi che era un'analogia, non un esempio reale. Un RWE sarebbe stato ciò che accade all'interno del framework ASP.NET e del codice dello sviluppatore. –

45

Response.Redirect ha un sovraccarico che accetta un argomento booleano che indica se la chiamata a Response.Redirect deve terminare la risposta. Chiamare il sovraccarico senza questo argomento equivale a specificare true per indicare che la risposta dovrebbe terminare.

Terminare la reponse significa che Response.End è chiamato dopo che la risposta è stata modificata per rendere il reindirizzamento accadere, e Response.End genera ThreadAbortException per terminare il modulo corrente.

Qualsiasi codice dopo una chiamata a Response.Redirect non viene mai chiamato (a meno che non si fornisca false per l'argomento extra). In realtà, il codice finally e alcuni gestori catch verranno eseguiti, ma non è possibile immettere ingerire a ThreadAbortException.

+3

Se non avessi fatto il 99% di scrivere la mia risposta quando l'hai pubblicata, non mi sarei preoccupato del mio. Un bel dettaglio aggiunto anche su ThreadAbortException. – Jon

+4

Perché questo non è stato accettato è indovinato da nessuno. –

3

C'è un altro parametro per Response.Redirect chiamato endResponse. Impostarlo come falso è una buona idea quando stai reindirizzando in un blocco catch try perché il contesto ha ancora bisogno del controllo per essere corretto. Quindi il tuo blocco catch raccoglierà l'eccezione.

L'avvertenza è che quando la pagina non è cancellabile, non tenterà di ottenere il controllo. Il caso più comune di questo è Global.asax.Quindi non devi preoccuparti di questa eccezione in quel contesto. Se non mi credi prova a riflettere il codice per questo metodo e dare un'occhiata.

Quindi per rispondere alla tua domanda non è necessario fare molto dopo un Response.Redirect quando si imposta endResponse su true quale è di default (cioè chiamato con il metodo che non accetta un valore bool).

Problemi correlati