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... finallyne 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.Endest nuisible , mais elle est utile dans certains cas limités.
- utiliser
Response.End()comme un jet inaccessible, pour terminer immédiatement leHttpResponsedans 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.CompleteRequestentraî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.Redirectet à la Server.Transferfois appel Response.Endet devrait également être évité.
Response.EndThreadAbortExceptiontrès bien.