Wird Response.End () als schädlich angesehen?
Dieser KB-Artikel sagt, dass ASP.NET istResponse.End()
bricht einen Thread ab.
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 kommt mir ziemlich hart vor. Wie der KB-Artikel sagt, folgt jeder Code in der AppResponse.End()
wird nicht ausgeführt, und das verstößt gegen den Grundsatz des geringsten Erstaunens. Es ist fast soApplication.Exit()
in einer WinForms-App. Die vom verursachte Thread-Abbruch-AusnahmeResponse.End()
ist nicht abfangbar, daher umgibt der Code in atry
...finally
wird nicht befriedigen.
Ich frage mich, ob ich es immer vermeiden sollteResponse.End()
.
Kann mir jemand empfehlen, wann ich verwenden sollResponse.End()
, wannResponse.Close()
und wannHttpContext.Current.ApplicationInstance.CompleteRequest()
?
Auf der Grundlage der eingegangenen Eingaben lautet meine Antwort:Ja,Response.End
Ist schädlich, aber es ist in einigen wenigen Fällen nützlich.
Response.End()
als ein uneinfangbarer Wurf, um das sofort zu beendenHttpResponse
in außergewöhnlichen Bedingungen. Kann auch beim Debuggen nützlich sein.VermeidenResponse.End()
Routineantworten zu vervollständigen.benutzenResponse.Close()
um die Verbindung zum Client sofort zu beenden. Prodieser MSDN-Blog-Beitrag, diese Methodeist nicht für die normale Verarbeitung von HTTP-Anforderungen vorgesehen. Es ist sehr unwahrscheinlich, dass Sie einen guten Grund haben, diese Methode aufzurufen.benutzenCompleteRequest()
eine normale Anfrage beenden.CompleteRequest
Bewirkt, dass die ASP.NET-Pipeline vorwärts zurEndRequest
Ereignis nach dem StromHttpApplication
Veranstaltung abgeschlossen. Also, wenn Sie anrufenCompleteRequest
Schreiben Sie dann etwas mehr auf die Antwort. Der Schreibvorgang wird an den Client gesendet.Bearbeiten - 13. April 2011
Weitere Klarheit gibt es hier:
- Nützlicher Beitrag im MSDN Blog
- Nützliche Analyse von Jon Reid