Questo articolo della KB dice che ASP.NET Response.End()
interrompe un thread.
Reflector mostra che assomiglia a questo:
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();
}
}
}
Questo mi sembra piuttosto duro. Come dice l'articolo KB, qualsiasi codice nell'app seguente Response.End()
non verrà eseguito e ciò viola il principio del minimo stupore. È quasi come Application.Exit()
in un'app WinForms. L'eccezione di interruzione del thread causata da Response.End()
non è rilevabile, quindi circondare il codice in un try
... finally
non è soddisfacente.
Mi chiedo se dovrei sempre evitare Response.End()
.
Qualcuno può suggerire, quando dovrei usare Response.End()
, quando Response.Close()
e quando HttpContext.Current.ApplicationInstance.CompleteRequest()
?
ref: il blog di Rick Strahl .
Sulla base dell'input che ho ricevuto, la mia risposta è Sì, Response.End
è dannosa , ma è utile in alcuni casi limitati.
- utilizzare
Response.End()
come tiro inattaccabile, per terminare immediatamenteHttpResponse
in condizioni eccezionali. Può essere utile anche durante il debug. EvitareResponse.End()
di completare le risposte di routine . - utilizzare
Response.Close()
per chiudere immediatamente la connessione con il client. Per questo post sul blog MSDN , questo metodo non è destinato alla normale elaborazione delle richieste HTTP. È altamente improbabile che tu abbia una buona ragione per chiamare questo metodo. - utilizzare
CompleteRequest()
per terminare una richiesta normale.CompleteRequest
fa in modo che la pipeline ASP.NET passiEndRequest
all'evento dopo ilHttpApplication
completamento dell'evento corrente . Quindi, se chiamiCompleteRequest
, quindi scrivi qualcosa in più alla risposta, la scrittura verrà inviata al client.
Modifica - 13 aprile 2011
Ulteriori chiarimenti sono disponibili qui:
- Post utili sul blog MSDN
- Analisi utili di Jon Reid
Response.Redirect
ed Server.Transfer
entrambi chiamano Response.End
e dovrebbero anche essere evitati.
Response.End
ThreadAbortException
bene.