Pourquoi est-ce que je reçois le message «Impossible de redirect une fois que les en-têtes HTTP ont été envoyés» lorsque j’appelle Response.Redirect ()?

Lorsque j’appelle Response.Redirect(someUrl) j’obtiens une exception HttpException: “Impossible de redirect une fois les en-têtes HTTP envoyés”.

Pourquoi est-ce que je reçois ça? Et comment puis-je résoudre ce problème?

Selon la documentation MSDN pour Response.Redirect(ssortingng url) , une exception HttpException sera lancée lorsqu’une “redirection est tentée après l’envoi des en-têtes HTTP”. Puisque Response.Redirect(ssortingng url) utilise l’en-tête de réponse Http “Location” ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), l’appel provoquera l’envoi des en-têtes au client. Cela signifie que si vous l’appelez une seconde fois ou si vous l’appelez après avoir envoyé les en-têtes d’une autre manière, vous obtiendrez une exception HttpException.

Une des façons d’éviter d’appeler Response.Redirect () plusieurs fois consiste à vérifier la propriété Response.IsRequestBeingRedirected (bool) avant de l’appeler.

 // Causes headers to be sent to the client (Http "Location" response header) Response.Redirect("http://www.stackoverflow.com"); if (!Response.IsRequestBeingRedirected) // Will not be called Response.Redirect("http://www.google.com"); 

Une fois que vous envoyez du contenu au client, les en-têtes HTTP ont déjà été envoyés. Un appel Response.Redirect() fonctionne en envoyant des informations spéciales dans les en-têtes pour que le navigateur demande une URL différente.

Comme les en-têtes étaient déjà envoyés, asp.net ne peut pas faire ce que vous voulez (modifier les en-têtes)

Vous pouvez contourner ce problème en effectuant la redirection avant de faire autre chose, ou b) en essayant d’utiliser Response.Buffer = true avant de faire quoi que ce soit d’autre, pour vous assurer qu’aucune sortie n’est envoyée au client terminé en cours d’exécution.

Une redirection ne peut se produire que si la première ligne d’un message HTTP est ” HTTP/1.x 3xx Redirect Reason “.

Si vous avez déjà appelé Response.Write() ou défini certains en-têtes, il sera trop tard pour une redirection. Vous pouvez essayer d’appeler Response.Headers.Clear() avant la redirection pour voir si cela aide.

Vérifiez simplement si vous avez défini l’option de mise en mémoire tampon sur false (par défaut, elle est vraie). Pour response.redirect au travail,

  1. La mise en mémoire tampon devrait être vraie,
  2. Vous ne devriez pas avoir envoyé plus de données en utilisant response.write qui dépasse la taille du tampon par défaut (auquel cas il se videra lui-même, entraînant l’envoi des en-têtes) et vous interdira donc de redirect.

Utiliser return RedirectPermanent(myUrl) fonctionné pour moi

Il y a une réponse simple à cela: vous avez produit quelque chose d’autre, comme du texte, ou tout autre élément lié à la sortie de votre page avant d’envoyer votre en-tête. Cela affecte pourquoi vous obtenez cette erreur.

Il suffit de vérifier votre code pour une sortie possible ou vous pouvez mettre l’en-tête au-dessus de votre méthode afin qu’elle soit envoyée en premier.

Mon problème a été résolu en ajoutant le gestionnaire d’exception pour gérer “Impossible de redirect une fois les en-têtes HTTP envoyés”. cette erreur comme indiqué ci-dessous le code

 catch (System.Threading.ThreadAbortException) { // To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent". } catch (Exception e) {//Here you can put your context.response.redirect("page.aspx");} 

J’ai résolu le problème en utilisant: Response.RedirectToRoute (“CultureEnabled”, RouteData.Values); au lieu de Response.Redirect.

La fonction de redirection fonctionne probablement en utilisant l’en-tête http ‘refresh’ (et peut-être aussi un code 30X). Une fois les en-têtes envoyés au client, le serveur ne peut pas append cette commande de redirection, c’est trop tard.