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... finallynon è 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 immediatamenteHttpResponsein 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.CompleteRequestfa in modo che la pipeline ASP.NET passiEndRequestall'evento dopo ilHttpApplicationcompletamento 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.Redirected Server.Transferentrambi chiamano Response.Ende dovrebbero anche essere evitati.
Response.EndThreadAbortExceptionbene.