2009-08-09 24 views

Respuesta

27

Esto puede no ser una respuesta completa, pero por lo que he visto ...

respuesta .Redirect sí hace que el código deje de ejecutarse lanzando System.Threading.ThreadAbortException.

Puede verlo usted mismo configurando el manejo de error global en Global.Asax y probando un Response.Redirect.

EDITAR

y aquí hay un enlace a la documentación que apoya mi respuesta:

redirigir las llamadas de extremo que provoca una excepción ThreadAbortException sobre finalización.

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

1

Mi entendimiento es que al emitir un Response.Redirect(), el código siguiente no ejecutará. Si lo piensas, tendría sentido no ejecutarlo. Básicamente le está diciendo a su código que quiere ir a otro lugar.

Ejemplo: Piense en ello como pedir una comida de valor en McDonalds. Después de que lo pida y empiecen a llenar su bebida, cambie de opinión y diga "ya sabes qué, olvídate de mi pedido. Voy a redirigir a Wendy's". En ese punto, van a dejar de hacer tus papas fritas y hamburguesas porque, bueno ... has decidido ir a otro lugar, es decir, redirigir la respuesta.

+1

Me gusta el uso de un ejemplo del mundo real. – David

+3

Diría que fue una analogía, no un ejemplo del mundo real. Un RWE habría sido lo que sucede dentro de ASP.NET Framework y el código del desarrollador. –

45

Response.Redirect tiene una sobrecarga que acepta un argumento booleano que indica si la llamada a Response.Redirect debe finalizar la respuesta. Llamar a la sobrecarga sin este argumento es lo mismo que especificar true para indicar que la respuesta debe finalizar.

Poner fin a la Reponse significa que Response.End se llama después de que la respuesta ha sido modificado para que la redirección ocurra, y se emite una Response.EndThreadAbortException dar por terminado el módulo actual.

Nunca se llama a ningún código después de una llamada a Response.Redirect (a menos que suministre false para el argumento adicional). En realidad, el código en finally y ciertos manejadores catch se ejecutarán, pero no puede tragar a ThreadAbortException.

+3

Si no hubiera estado al 99% escribiendo mi respuesta cuando publicaste esto, no me habría molestado con la mía. Bonito detalle adicional sobre ThreadAbortException también. – Jon

+4

Nadie adivina por qué no se aceptó esto. –

3

Hay otro parámetro para Response.Redirect llamado endResponse. Establecerlo como falso es una buena idea cuando está redirigiendo en un bloque try catch porque el contexto aún necesita control para ser correcto. Por lo tanto, tu bloque de catch recogerá la excepción.

La advertencia al respecto es que cuando la página no es Cancelable, no intentará obtener el control. El caso más común de esto es Global.asax.Entonces, no necesita preocuparse por esta excepción en ese contexto. Si no me cree, intente reflejar el código de este método y eche un vistazo.

Para responder a su pregunta, no es necesario hacer mucho después de un Response.Redirect cuando establece endResponse en true, que es por defecto (es decir, llamado con el método que no toma un bool).

Cuestiones relacionadas