Este artículo de KB dice que ASP.NET Response.End()aborta un hilo.
Reflector muestra que se ve así:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
Esto me parece bastante duro. Como dice el artículo de KB, Response.End()no se ejecutará ningún código en la aplicación siguiente , y eso viola el principio de mínimo asombro. Es casi como Application.Exit()en una aplicación WinForms. El hilo de aborto causado por la excepción Response.End()no es capturable, por lo que rodea el código en un try... finallyno va a satisfacer.
Me hace preguntarme si siempre debería evitarlo Response.End().
¿Alguien puede sugerir cuándo debo usar Response.End()cuándo Response.Close()y cuándo HttpContext.Current.ApplicationInstance.CompleteRequest()?
ref: entrada del blog de Rick Strahl .
Según la información que he recibido, mi respuesta es Sí, Response.Endes dañino , pero es útil en algunos casos limitados.
- utilícelo
Response.End()como un tiro inalcanzable, para terminar inmediatamenteHttpResponseen condiciones excepcionales. Puede ser útil durante la depuración también. EviteResponse.End()completar respuestas de rutina . - use
Response.Close()para cerrar inmediatamente la conexión con el cliente. Según esta publicación de blog de MSDN , este método no está destinado al procesamiento normal de solicitudes HTTP. Es muy poco probable que tenga una buena razón para llamar a este método. - use
CompleteRequest()para finalizar una solicitud normal.CompleteRequesthace que la canalización de ASP.NET salte alEndRequestevento una vezHttpApplicationque se complete el evento actual . Entonces, si llamaCompleteRequesty luego escribe algo más en la respuesta, la escritura se enviará al cliente.
Editar - 13 de abril de 2011
Más claridad está disponible aquí:
- Publicación útil en el blog de MSDN
- Análisis útil de Jon Reid
Response.Redirecty Server.Transferambos llaman Response.Endy también deben evitarse.
Response.EndThreadAbortExceptionmuy bien.