Dieser KB-Artikel besagt, dass ASP.NET Response.End()einen Thread abbricht.
Reflektor zeigt, dass es so aussieht:
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();
}
}
}
Das scheint mir ziemlich hart zu sein. Wie der KB-Artikel sagt, wird kein Code in der folgenden App Response.End()ausgeführt, was gegen das Prinzip des geringsten Erstaunens verstößt. Es ist fast wie Application.Exit()in einer WinForms-App. Die durch verursachte Thread-Abbruch-Ausnahme Response.End()ist nicht abfangbar, sodass das Umgeben des Codes in einem try... finallynicht zufriedenstellend ist.
Ich frage mich, ob ich es immer vermeiden sollte Response.End().
Kann jemand vorschlagen, wann ich Response.End()wann Response.Close()und wann verwenden soll HttpContext.Current.ApplicationInstance.CompleteRequest()?
Ref: Rick Strahls Blogeintrag .
Basierend auf den Eingaben, die ich erhalten habe, lautet meine Antwort: Ja, Response.Endist schädlich , aber in einigen begrenzten Fällen nützlich.
- Verwenden Sie
Response.End()als nicht fangbarer Wurf, um dieHttpResponsein außergewöhnlichen Bedingungen sofort zu beenden . Kann auch beim Debuggen hilfreich sein. Vermeiden SieResponse.End()routinemäßige Antworten . - Verwenden Sie
Response.Close()diese Option, um die Verbindung zum Client sofort zu schließen. Gemäß diesem MSDN-Blogbeitrag ist diese Methode nicht für die normale Verarbeitung von HTTP-Anforderungen vorgesehen. Es ist höchst unwahrscheinlich, dass Sie einen guten Grund haben, diese Methode aufzurufen. - Verwenden Sie
CompleteRequest()diese Option, um eine normale Anforderung zu beenden.CompleteRequestbewirkt, dass die ASP.NET-PipelineEndRequestnach Abschluss des aktuellenHttpApplicationEreignisses zum Ereignis springt . Wenn Sie also anrufenCompleteRequestund dann etwas mehr in die Antwort schreiben, wird der Schreibvorgang an den Client gesendet.
Bearbeiten - 13. April 2011
Weitere Klarheit finden Sie hier:
- Nützlicher Beitrag im MSDN-Blog
- Nützliche Analyse von Jon Reid
Response.Redirectund Server.Transferbeide rufen an Response.Endund sollten auch vermieden werden.
Response.EndThreadAbortExceptionganz gut.