Quand un ASP.NET système.Web.HttpResponse.End () est appelé, le thread courant est avorté?
quand un système.Web.HttpResponse.Fin() est appelé un Système.Fil.L'abandon est viré, ce qui est une exception? J'ai un peu de journalisation et ceci est listé dans le fichier journal...
une première chance
exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace : at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort(Object stateInfo)
at System.Web.HttpResponse.End()
at DotNetOpenId.Response.Send()
at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:UsersPure KromeDocumentsVisual Studio 2008ProjectsMyProjectProjectsServicesAuthenticationOpenIdAuthenticationService.cs:line 108
at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:UsersPure KromeDocumentsVisual Studio 2008ProjectsMyProjectProjectsMVC ApplicationControllersAuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code
est-ce que ce comportement est normal et est-il possible d'avorter avec grâce au lieu (qu'est-ce qui ressemble) d'un avortement brusque?
mise à Jour
Jusqu'à présent il le commun recensement que c'est par conception . Donc je me demande s'il est possible que nous puissions prendre cette question et voir si nous pourrions modifier le code pour qu'il n'y ait pas l'impression que nous finissions le fil prématurément et que nous sortions avec grâce ... Possible? Les exemples de Code?
5 réponses
un abandon "gracieux" n'existe pas. Vous pouvez simplement débusquer () la réponse, cependant, au lieu de la terminer et laisser le framework prendre soin de fermer la connexion pour vous. Je suppose dans ce cas que vous voulez la réponse envoyée au client, c'est à dire, le cas typique.
Selon MSDN , appelant la Réponse.End () lance la ThreadAbortException lorsque la réponse se termine prématurément. Vous ne devriez vraiment appeler Réponse.Fin() lorsque vous souhaitez que l'exception soulevée.
il n'y a rien d'ingrat inhérent à ce qu'une exception remonte votre pile pour arrêter l'exécution en cours. Certainement pas plus que vous lancer une exception et attraper une place inférieure dans votre exception.
je regarderais le filtrage de votre logging. Si vous utilisez ASP.Net surveillance de la santé vous pouvez configurer / mapper chaque exception à un fournisseur donné (journal d'événements, courrier, etc) pour contrôler si vous recevez une notification pour les exceptions threadabort ou pas. Si c'est de journalisation personnalisé alors je voudrais juste ajouter un if pour vérifier.
notez que vous ne pouvez pas manger une ThreadAbortException alors même si votre code de journalisation fait quelque chose comme catch(Exception e) { // log exception and then do not throw again }
la ThreadAbortException sera encore soulevée par le framework une fois que votre catch block sort.
N'utilisez pas de réponse.End () méthode parce qu'elle utilise L'Application.Fin() et arrêter l'application. Utiliser ensuite la requête HTTP ou la réponse violant le Cycle de vie de la Page. Utilisez HttpContext.Actuel.Réponse.Close () ou HttpContext.Actuel.ApplicationInstance.CompleteRequest ();
j'ai utilisé tous les changements ci-dessus, mais encore j'étais même problème sur mon application web.
puis j'ai contacté mon fournisseur d'hébergement et leur ai demandé de vérifier si un logiciel ou un antivirus bloquant nos fichiers à transférer via HTTP. ou le FAI / réseau ne permet pas le transfert de fichier.
ils ont vérifié les paramètres du serveur et contourner le" pare-feu partagé du Centre de données " pour mon serveur et maintenant notre application a commencé à télécharger le fichier.
espérons que cette réponse aidera quelqu'un.C'est ce qui a fonctionné pour moi