¿Response.End () se considera dañino?
Este artículo de KB dice que ASP.NETResponse.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, cualquier código en la aplicación siguienteResponse.End()
No se ejecutará, y eso viola el principio de menos asombro. Es casi comoApplication.Exit()
en una aplicación de WinForms. La excepción de cancelación de hilo causada porResponse.End()
no es capturable, por lo que rodea el código en unatry
...finally
no va a satisfacer
Me hace preguntarme si siempre debo evitar.Response.End()
.
¿Alguien puede sugerir, cuando debería usarResponse.End()
, cuandoResponse.Close()
y cuandoHttpContext.Current.ApplicationInstance.CompleteRequest()
?
árbitro:Entrada de blog de Rick Strahl.
Basado en la entrada que he recibido, mi respuesta es,Sí,Response.End
Es dañino, pero es útil en algunos casos limitados.
Response.End()
como un lanzamiento incomparable, para terminar inmediatamente elHttpResponse
En condiciones excepcionales. Puede ser útil durante la depuración también.EvitarResponse.End()
para completar las respuestas de rutina.utilizarResponse.Close()
Para cerrar inmediatamente la conexión con el cliente. Poresta entrada de blog de MSDN, este métodono está diseñado para el procesamiento normal de solicitudes HTTP. Es muy poco probable que tenga una buena razón para llamar a este método.utilizarCompleteRequest()
para finalizar una solicitud normal.CompleteRequest
hace que la tubería de ASP.NET salte a laEndRequest
evento, después del actualHttpApplication
el evento se completa. Así que si llamasCompleteRequest
Luego, escriba algo más en la respuesta, la escritura se enviará al cliente.Edición - 13 de abril de 2011
Más claridad está disponible aquí:
- Publicación útil en el blog de MSDN
- Análisis útil por Jon Reid