Cet Article dit que ASP.NET's Réponse.Fin() interrompt un thread.
Réflecteur montre qu'il 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 semble assez dure pour moi. Comme l'article le dit, tout le code dans l'application de Réponse suivants.Fin() ne sera pas exécuté, et qui viole le principe de moindre surprise. C'est presque comme Application.Exit() dans une application WinForms. L'abandon de thread exception provoquée par la Réponse.Fin() n'est pas catchable, si entourant le code dans un essai..enfin il ne peut pas satisfaire.
Il me fait me demander si je devrait toujours éviter de Réponse.Fin().
Quelqu'un peut-il suggérer, quand devrais-je utiliser la Réponse.End(), lorsque la Réponse.Close() et quand HttpContext.Actuel.ApplicationInstance.CompleteRequest()?
ref: Rick Strahl de l'entrée de blog.
D'après les commentaires que j'ai reçu, ma réponse est Oui, la Réponse.La fin est nuisible, mais il est utile dans certains cas limités.
- utiliser la Réponse.Fin() comme une part insaisissable de jeter, de résilier immédiatement le HttpResponse dans des conditions exceptionnelles. Peut être utile lors du débogage. Éviter De Réponse.Fin() pour valider la routine de réponses.
- utiliser la Réponse.Close() pour fermer immédiatement la connexion avec le client. Par cette MSDN billet de blog, cette méthode n'est pas prévu pour HTTP normal de traitement de la demande. Il est très peu probable que vous avez une bonne raison d'appeler cette méthode.
- utilisation CompleteRequest() pour mettre fin à une requête normale. CompleteRequest causes du RÉSEAU "intermédiaires" pour passer à l'événement EndRequest, après que le courant HttpApplication événement se termine. Donc, si vous appelez CompleteRequest, puis d'écrire quelque chose de plus pour la réponse, l'écriture sera envoyé au client.
Edit - 13 Avril 2011
Une plus grande clarté est disponible ici:
- Utile post sur le Blog MSDN
- Analyse utile par Jon Reid