No hay una solución simple y elegante al Redirect
problema en ASP.Net WebForms. Puede elegir entre la solución sucia y la solución tediosa
Sucio : Response.Redirect(url)
envía una redirección al navegador y luego lanza una ThreadAbortedException
para terminar el hilo actual. Por lo tanto, no se ejecuta ningún código más allá de la llamada Redirect (). Desventajas: es una mala práctica y tiene implicaciones de rendimiento para matar hilos como este. Además, ThreadAbortedExceptions
aparecerá en el registro de excepciones.
Tedioso : la forma recomendada es llamar Response.Redirect(url, false)
y, sin Context.ApplicationInstance.CompleteRequest()
embargo, la ejecución del código continuará y el resto de los controladores de eventos en el ciclo de vida de la página aún se ejecutarán. (Por ejemplo, si realiza la redirección en Page_Load, no solo se ejecutará el resto del controlador, Page_PreRender, etc., sino que también se invocará: la página representada simplemente no se enviará al navegador. Puede evitar el procesamiento adicional al por ejemplo, establecer un indicador en la página y luego permitir que los controladores de eventos posteriores verifiquen este indicador antes de realizar cualquier procesamiento.
(La documentación CompleteRequest
indica que "hace que ASP.NET omita todos los eventos y el filtrado en la cadena de ejecución de la canalización HTTP ". Esto puede ser fácilmente malinterpretado. Omite más filtros y módulos HTTP, pero no omite más eventos en el ciclo de vida actual de la página ).
El problema más profundo es que WebForms carece de un nivel de abstracción. Cuando está en un controlador de eventos, ya está en el proceso de crear una página para la salida. La redirección en un controlador de eventos es fea porque está finalizando una página parcialmente generada para generar una página diferente. MVC no tiene este problema, ya que el flujo de control es independiente de las vistas de representación, por lo que puede hacer una redirección limpia simplemente devolviendo un RedirectAction
en el controlador, sin generar una vista.
Context.ApplicationInstance.CompleteRequest();
. ¿Por qué? ¿Tendré que hacerloreturn
desde el controlador de eventos condicionalmente?