Pourquoi La Réponse.Rediriger les causes du Système.Le filetage.ThreadAbortException?
Quand j'ai utiliser la Réponse.Redirect(...) pour rediriger mon formulaire vers une nouvelle page, j'obtiens l'erreur:
Une exception de première chance de type 'System.Le filetage.ThreadAbortException' s'est produite dans mscorlib.dll
Une exception de type 'System.Le filetage.ThreadAbortException' s'est produite dans mscorlib.dll mais n'a pas été traitée dans le code utilisateur
Ma compréhension de cette est que l'erreur est causée par le serveur web avorter le reste de la page de la réponse.redirection a été appelé.
Je sais que je peux ajouter un second paramètre de Response.Redirect
qui est appelé endResponse. Si j'ai mis endResponse Vrai que j'ai toujours l'erreur, mais si je l'ai mis à False, alors je ne sais pas. Je suis assez sûr cependant que cela signifie que le serveur est en cours d'exécution le reste de la page, j'ai redirigé loin de. Ce qui semble être inefficace pour dire le moins. Est-il une meilleure façon de le faire? Quelque chose d'autre que Response.Redirect
ou est-il un moyen de forcer l'ancienne page pour arrêter le chargement d'où je ne vais pas obtenir un ThreadAbortException
?
Vous devez vous connecter pour publier un commentaire.
Le modèle correct est l'appel de la Redirection de surcharge avec endResponse=false et de faire un appel pour dire IIS pipeline qu'il devrait passer directement à l'EndRequest étape une fois que vous revenez de contrôle:
Ce blog de Thomas Marquardt fournit des détails supplémentaires, y compris la façon de gérer le cas particulier de la redirection à l'intérieur d'un Application_Error gestionnaire.
Context.ApplicationInstance.CompleteRequest();
. Pourquoi? Vais-je devoirreturn
par le gestionnaire d'événements conditionnellement?The old version of Redirect
la phrase que vous utilisez dans votre commentaire, c'est pas comme MS changé la mise en œuvre, c'est juste une autre surcharge.Il est pas solution simple et élégante à la
Redirect
problème ASP.Net WebForms. Vous pouvez choisir entre les Sale solution et la Fastidieux solutionSale:
Response.Redirect(url)
envoie une redirection du navigateur, puis jette unThreadAbortedException
de résilier le thread courant. Si aucun code n'est exécuté après le Redirect()-appel. Inconvénients: C'est une mauvaise pratique et ont des implications sur les performances de tuer des fils comme cela. Aussi,ThreadAbortedExceptions
apparaîtra dans l'enregistrement d'exception.Fastidieux: il est recommandé d'appeler
Response.Redirect(url, false)
et puisContext.ApplicationInstance.CompleteRequest()
Toutefois, l'exécution de code continuera et le reste des gestionnaires d'événements dans la page cycle de vie seront toujours exécutées. (E. g. si vous effectuez la redirection dans le Page_Load, non seulement le reste de l'gestionnaire être exécuté, Page_PreRender et ainsi de suite, permet d'être appelé - le rendu de la page sera tout simplement pas être envoyé au navigateur. Vous pouvez éviter le traitement supplémentaire, par exemple en définissant un indicateur sur la page, puis laissez ultérieure des gestionnaires d'événement de vérifier ce drapeau avant d'effectuer tout traitement.(La documentation à
CompleteRequest
affirme qu'il "Causes ASP.NET pour contourner tous les événements et de filtrage dans le pipeline HTTP chaîne d'exécution". Cela peut facilement être mal compris. Il ne contournement de plus amples HTTP filtres et modules, mais il n'a pas de contournement d'autres événements dans le courant page cycle de vie.)Le problème plus profond, c'est que WebForms manque un niveau d'abstraction. Lorsque vous êtes dans un gestionnaire d'événement, vous êtes déjà dans le processus de construction d'une page à la sortie. La redirection dans un gestionnaire d'événement est laid parce que vous êtes la résiliation partielle d'une page générée dans le but de générer une page différente. MVC n'a pas ce problème puisque le flux de contrôle est séparé de rendre la vue, de sorte que vous pouvez effectuer une redirection par simple retour d'un
RedirectAction
dans le contrôleur, sans générer de vue.Je sais je suis en retard, mais je n'ai jamais eu cette erreur si mon
Response.Redirect
est dans unTry...Catch
bloc.Ne placez jamais une Réponse.Rediriger dans un bloc Try...Catch. C'est une mauvaise pratique
Modifier
En réponse à @Kiquenet commentaire, voici ce que je voudrais faire comme une alternative à mettre la Réponse.Redirection dans le bloc Try...Catch.
J'avais casser la méthode/fonction en deux étapes.
La première étape à l'intérieur du bloc Try...Catch effectue les actions demandées et définit un "résultat" de la valeur pour indiquer le succès ou l'échec des actions.
Étape deux à l'extérieur du bloc Try...Catch ne la redirection (ou ne pas) en fonction de ce que le "résultat" de la valeur est.
Ce code est loin d'être parfait et ne devraient probablement pas être copié, puisque je n'ai pas testé
Response.Redirect()
déclenche une exception pour annuler la demande actuelle.Ce L'article décrit ce comportement (aussi pour la
Request.End()
etServer.Transfer()
méthodes).Pour
Response.Redirect()
il existe une surcharge:Si vous passez endResponse=false, alors, l'exception n'est pas levée (mais le moteur d'exécution continuer le traitement de la demande en cours).
Si endResponse=true (ou si l'autre surcharge est utilisé), l'exception est levée, et la demande actuelle sera immédiatement résilié.
C'est juste la façon dont la Réponse.Redirection(url, true) fonctionne. Il jette la ThreadAbortException pour interrompre le fil. Il suffit de les ignorer cette exception. (Je présume que c'est une erreur globale gestionnaire/enregistreur de là où vous la voyez?)
Une intéressante discussion Est La Réponse.Fin() considéré comme dangereux?
Voici la ligne officielle sur le problème (je ne pouvais pas trouver la dernière, mais je ne pense pas que la situation a changé depuis les versions ultérieures de .net)
I think that links are fantastic, but they should never be the only piece of information in your answer.
Aussi j'ai essayé d'autres solution, mais une partie du code exécuté après la redirection.
Donc si nécessaire pour empêcher l'exécution de code après rediriger
j'ai même essayé d'éviter cela, juste au cas faire l'Abandon sur le fil manuellement, mais je préfère le laisser à la "CompleteRequest" et de passer mon code de retour des commandes après la redirection de toute façon. Donc cela peut être fait
Ce que j'ai à faire est de récupérer cette exception, avec un autre des exceptions possibles. Espérons que cela aide quelqu'un.
J'ai eu ce problème aussi.
Essayez d'utiliser de Serveur.Transfert au lieu de Réponse.Redirection
A travaillé pour moi