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
... finally
nicht 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.End
ist schädlich , aber in einigen begrenzten Fällen nützlich.
- Verwenden Sie
Response.End()
als nicht fangbarer Wurf, um dieHttpResponse
in 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.CompleteRequest
bewirkt, dass die ASP.NET-PipelineEndRequest
nach Abschluss des aktuellenHttpApplication
Ereignisses zum Ereignis springt . Wenn Sie also anrufenCompleteRequest
und 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.Redirect
und Server.Transfer
beide rufen an Response.End
und sollten auch vermieden werden.
Response.End
ThreadAbortException
ganz gut.