2009-09-01 23 views
5

Sto imparando ASP.NET e stavo guardando QueryStrings.Perché ottengo un'eccezione generata quando eseguo Response.Redirect()?

Uno degli esempi stavo guardando ganci un pulsante fino a una chiamata di reindirizzamento:

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); 
     } 
    } 

Perché è gettare un ThreadAbortException qui? È normale? Dovrei fare qualcosa a riguardo? Le eccezioni non sono generalmente una buona cosa, quindi mi sono allarmato quando ho visto questo.

+0

http://stackoverflow.com/questions/1063625/is-there -qualcosa-che-impedisce-risposta-redirect-to-work-inside-try-catch-block –

risposta

12

Questo è di progettazione. Questo KB article descrive il comportamento (anche per i metodi Request.End() e Server.Transfer()).

Per Response.Redirect() esiste un sovraccarico:

Response.Redirect(String url, bool endResponse) 

Se si passa endResponse = false, quindi l'eccezione non viene lanciata (ma il runtime continuerà l'elaborazione della richiesta corrente).

Se endResponse = true (o se si utilizza il sovraccarico senza l'argomento bool), viene generata l'eccezione e la richiesta corrente verrà immediatamente interrotta.

+2

Dubito che in realtà sia "design", forse una conseguenza sfortunata del loro design? ;) – MedicineMan

+2

"Per progetto" non implica che il design scelto sia perfetto ;-) – M4N

3

Questo è normale. Server.Transfer() genera anche la stessa eccezione.

Questo perché internamente entrambi i metodi chiamano Response.End(), che interrompe immediatamente l'elaborazione della richiesta corrente. Rick Strahl ha uno pretty good blog post che analizza il motivo per cui non c'è praticamente nulla che tu possa fare per evitare queste eccezioni.

1

Credo che sia necessario seguire le istruzioni in questo articolo della Knowledge Base. Response.Redirect chiama Response.End(), a meno che non si sia utilizzato il sovraccarico appositamente creato per evitare questo comportamento. Una volta terminata la risposta, non possono più essere eseguite altre operazioni, quindi l'assistenza tecnica.

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

2

E 'normale in quanto è ciò che si intende per accadere. Fondamentalmente quando la risposta è stata impostata su un reindirizzamento, ASP.NET si aspetta che tu abbia completamente finito con la richiesta. Abortisce il thread come un modo per impedire che si verifichi qualsiasi altra elaborazione (in pratica chiama Response.End per te e che genera l'eccezione).

Mi sembra che sia un po 'un abuso di eccezioni, ma è così che funziona. Puoi usare il sovraccarico che ha un secondo parametro (e passare false) per evitare che ciò accada se lo desideri - ma se è così, assicurati che nient'altro tenti di scrivere alla risposta!

0

Chiamando il sovraccarico di Redirect(), che vuole solo un URL anche si traduce in una chiamata a Response.End() - che genera un'eccezione ThreadAbort per garantire che nessun altro codice dopo il reindirizzamento nella tua pagina/UC viene eseguito.

Non dovresti prendere questa eccezione ..dovresti ignorarlo nel tuo codice o utilizzare il sovraccarico di Redirect() che accetta un valore booleano che indica se continuare ad elaborare la richiesta dopo il reindirizzamento.

2

Response.Redirect chiamate Response.End internamente, in modo che genera l'eccezione, utilizzare:

Response.Redirect(url, false); 
0

Già. Io codifico un sub di uscita dopo quelli ma so che non è stato raggiunto.

Suppongo che se tu volessi potresti mangiare l'eccezione e continuare con altre cose, ma non lo consiglierei.

0

Già un mucchio di risposte ragionevoli qui. Un altro punto degno di nota però. L'eccezione di interruzione del thread è una di quelle rare eccezioni che è possibile intercettare e codificare, ma non è possibile eliminarla. Viene automaticamente ributtato alla fine di ogni blocco try/catch/finally indipendentemente da ciò che fai.

E se decidi di vivere con questa eccezione, dovresti assicurarti che il monitoraggio della tua salute lo consenta e non lo segnala come un problema, quindi non rimanere bloccato davanti a un gruppo di elementi non tecnici manager che cercano di spiegare perché il tuo sito sta generando così tante eccezioni di interruzione del thread. (Avevo un manager convinto che tutti questi aborti su thread stessero lasciando un disastro dietro il quale ovviamente era l'esatto opposto dell'intenzione del thread.)

Problemi correlati