Cet article de la base de Response.End()
connaissances indique que ASP.NET abandonne un thread.
Le réflecteur montre que cela ressemble à ceci:
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();
}
}
}
Cela me semble assez dur. Comme le dit l'article de la base de connaissances, aucun code de l'application suivante Response.End()
ne sera exécuté, ce qui viole le principe du moindre étonnement. C'est presque comme Application.Exit()
dans une application WinForms. L'exception d'annulation de thread provoquée par Response.End()
n'est pas capturable, donc entourer le code dans un try
... finally
ne sera pas satisfaisant.
Je me demande si je devrais toujours éviter Response.End()
.
Quelqu'un peut-il suggérer, quand dois-je utiliser Response.End()
, quand Response.Close()
et quand HttpContext.Current.ApplicationInstance.CompleteRequest()
?
réf: entrée de blog de Rick Strahl .
Sur la base des informations que j'ai reçues, ma réponse est oui, Response.End
est nuisible , mais elle est utile dans certains cas limités.
- utiliser
Response.End()
comme un jet inaccessible, pour terminer immédiatement leHttpResponse
dans des conditions exceptionnelles. Peut également être utile lors du débogage. ÉvitezResponse.End()
de compléter les réponses de routine . - utiliser
Response.Close()
pour fermer immédiatement la connexion avec le client. Selon cet article de blog MSDN , cette méthode n'est pas destinée au traitement normal des requêtes HTTP. Il est très peu probable que vous ayez une bonne raison d'appeler cette méthode. - utiliser
CompleteRequest()
pour mettre fin à une demande normale.CompleteRequest
entraîne le pipeline ASP.NET à passer à l'EndRequest
événement, une fois l'HttpApplication
événement en cours terminé. Donc, si vous appelezCompleteRequest
, puis écrivez quelque chose de plus dans la réponse, l'écriture sera envoyée au client.
Edit - 13 avril 2011
Plus de clarté est disponible ici:
- Article utile sur le blog MSDN
- Analyse utile par Jon Reid
Response.Redirect
et à la Server.Transfer
fois appel Response.End
et devrait également être évité.
Response.End
ThreadAbortException
très bien.