Lorsque j'utilise Response.Redirect (...) pour rediriger mon formulaire vers une nouvelle page, j'obtiens l'erreur:
Une exception de première chance de type «System.Threading.ThreadAbortException» s'est produite dans mscorlib.dll
Une exception de type «System.Threading.ThreadAbortException» s'est produite dans mscorlib.dll mais n'a pas été gérée dans le code utilisateur
Je crois comprendre que l'erreur est due au fait que le serveur Web a abandonné le reste de la page sur laquelle response.redirect a été appelé.
Je sais que je peux ajouter un deuxième paramètre Response.Redirect
appelé endResponse. Si je mets endResponse à True, j'obtiens toujours l'erreur, mais si je la mets à False, je ne le fais pas. Je suis à peu près sûr que cela signifie que le serveur Web exécute le reste de la page que j'ai redirigée. Ce qui semble pour le moins inefficace. Y a-t-il une meilleure manière de faire cela? Autre chose Response.Redirect
ou existe-t-il un moyen de forcer l’ancienne page à arrêter de se charger là où je n’obtiendrai pas ThreadAbortException
?
Context.ApplicationInstance.CompleteRequest();
. Pourquoi? Dois-jereturn
le soumettre au gestionnaire d'événements de manière conditionnelle?The old version of Redirect
expression que vous utilisez dans votre commentaire, ce n'est pas comme si MS a changé la mise en œuvre, c'est juste une autre surcharge.Il n'y a pas de solution simple et élégante au
Redirect
problème dans ASP.Net WebForms. Vous pouvez choisir entre la solution Dirty et la solution TediousDirty :
Response.Redirect(url)
envoie une redirection vers le navigateur, puis lance unThreadAbortedException
pour terminer le thread actuel. Donc, aucun code n'est exécuté après l'appel Redirect (). Inconvénients: c'est une mauvaise pratique et avoir des implications sur les performances de tuer des threads comme celui-ci. En outre,ThreadAbortedExceptions
apparaîtra dans la journalisation des exceptions.Fastidieux : la méthode recommandée consiste à appeler
Response.Redirect(url, false)
puis àContext.ApplicationInstance.CompleteRequest()
exécuter. Cependant, l'exécution du code se poursuivra et le reste des gestionnaires d'événements du cycle de vie de la page sera toujours exécuté. (Par exemple, si vous effectuez la redirection dans▶ Load, non seulement le reste du gestionnaire sera exécuté, également la fonction PrendPenderRender, etc. sera également appelée - la page rendue ne sera simplement pas envoyée au navigateur. Vous pouvez éviter le traitement supplémentaire Par exemple, définir un indicateur sur la page, puis laisser les gestionnaires d'événements suivants vérifier cet indicateur avant de procéder à tout traitement.(La documentation
CompleteRequest
indique qu'il " oblige ASP.NET à contourner tous les événements et le filtrage dans la chaîne d'exécution du pipeline HTTP ". Cela peut facilement être mal compris. Il contourne d'autres filtres et modules HTTP, mais il ne contourne pas d'autres événements dans le cycle de vie de la page en cours .)Le problème le plus profond est que WebForms n'a pas un niveau d'abstraction. Lorsque vous êtes dans un gestionnaire d'événements, vous êtes déjà en train de créer une page à afficher. La redirection dans un gestionnaire d'événements est moche car vous terminez une page partiellement générée afin de générer une page différente. MVC n'a pas ce problème car le flux de contrôle est distinct des vues de rendu, vous pouvez donc effectuer une redirection propre en renvoyant simplement un
RedirectAction
dans le contrôleur, sans générer de vue.la source
Je sais que je suis en retard, mais je n'ai jamais eu cette erreur que si mon
Response.Redirect
est dans unTry...Catch
bloc.Ne placez jamais un Response.Redirect dans un bloc Try ... Catch. C'est une mauvaise pratique
Éditer
En réponse au commentaire de @ Kiquenet, voici ce que je ferais comme alternative à la mise de Response.Redirect dans le bloc Try ... Catch.
Je décomposerais la méthode / fonction en deux étapes.
La première étape à l'intérieur du bloc Try ... Catch exécute les actions demandées et définit une valeur "résultat" pour indiquer le succès ou l'échec des actions.
La deuxième étape en dehors du bloc Try ... Catch effectue la redirection (ou non) en fonction de la valeur du "résultat".
Ce code est loin d'être parfait et ne devrait probablement pas être copié car je ne l'ai pas testé
la source
Response.Redirect()
lève une exception pour abandonner la demande en cours.Cet article de la base de connaissances décrit ce comportement (également pour les méthodes
Request.End()
etServer.Transfer()
).Car
Response.Redirect()
il existe une surcharge:Si vous passez endResponse = false , l'exception n'est pas levée (mais le runtime continuera de traiter la demande en cours).
Si endResponse = true (ou si l'autre surcharge est utilisée), l'exception est levée et la demande en cours sera immédiatement terminée.
la source
Voici la ligne officielle sur le problème (je n'ai pas pu trouver la dernière, mais je ne pense pas que la situation ait changé pour les versions ultérieures de .net)
la source
I think that links are fantastic, but they should never be the only piece of information in your answer.
Voilà comment ça
Response.Redirect(url, true)
marche. Il lance leThreadAbortException
pour abandonner le fil. Ignorez juste cette exception. (Je suppose que c'est un gestionnaire / enregistreur d'erreurs global où vous le voyez?)Une discussion connexe intéressante est
Response.End()
considérée comme nuisible? .la source
J'ai également essayé une autre solution, mais une partie du code a été exécutée après la redirection.
Donc, si vous avez besoin d'empêcher l'exécution de code après la redirection
la source
j'ai même essayé d'éviter cela, juste au cas où faire l'abandon sur le fil manuellement, mais je le laisse plutôt avec le "CompleteRequest" et continue - mon code a des commandes de retour après les redirections de toute façon. Cela peut donc être fait
la source
Ce que je fais, c'est attraper cette exception, ainsi que d'autres exceptions possibles. J'espère que cela aidera quelqu'un.
la source
J'ai aussi eu ce problème.
Essayez d'utiliser
Server.Transfer
au lieu deResponse.Redirect
A travaillé pour moi.
la source