web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois le message "Impossible de rediriger après l'envoi des en-têtes HTTP" lorsque j'appelle Response.Redirect ()?

Lorsque j'appelle Response.Redirect(someUrl), je reçois une exception HttpException: "Impossible de rediriger une fois les en-têtes HTTP envoyés".

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

78
Samuel Meacham

Selon la documentation MSDN relative à Response.Redirect(string url), une exception HttpException est émise lorsqu'une "redirection est tentée après l'envoi des en-têtes HTTP". Étant donné que Response.Redirect(string url) utilise l'en-tête de réponse HTTP "Location" ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), son appel entraînera l'envoi des en-têtes au client. Cela signifie que si vous appelez une seconde fois ou après l'avoir envoyé d'une autre manière, vous obtiendrez l'exception HttpException.

Une façon de se protéger d'appeler plusieurs fois Response.Redirect () 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");
115
Samuel Meacham

Une fois que vous avez envoyé 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 qui obligent le navigateur à demander une URL différente. 

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

Vous pouvez contourner cela en a) soit en effectuant la redirection avant de faire quoi que ce soit, soit b) essayez d'utiliser Response.Buffer = true avant de faire autre chose, pour vous assurer qu'aucune sortie n'est envoyée au client jusqu'à ce que la page entière soit terminée en cours d'exécution.

17
Philip Rieck

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 des 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 vous aide.

8
Mark Cidade

Il suffit de vérifier si vous avez défini l'option de mise en mémoire tampon sur false (sa valeur par défaut est true). Pour que response.redirect fonctionne,

  1. La mise en mémoire tampon devrait être vraie,
  2. vous ne devriez pas avoir envoyé plus de données à l'aide de response.write, ce qui dépasse la taille de la mémoire tampon par défaut (dans ce cas, il se videra lui-même, ce qui entraînera l'envoi des en-têtes), ce qui vous interdisera la redirection.
3
Dhananjay

Utiliser return RedirectPermanent(myUrl) a fonctionné pour moi

2
Vasilis

Il existe une réponse simple à cela: Vous avez été exporté par autre chose, par exemple du texte ou tout ce qui concerne 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 placer l’en-tête au-dessus de votre méthode afin qu’il soit envoyé en premier.

1
DucDigital

Si vous essayez de rediriger après l'envoi des en-têtes (par exemple, si vous effectuez une redirection d'erreur à partir d'une page partiellement générée), vous pouvez envoyer du code Javascript client (location.replace ou location.href, etc.). pour rediriger vers l'URL de votre choix. Bien sûr, cela dépend de ce que HTML a déjà été envoyé.

1
Brad

Mon problème a été résolu en ajoutant le gestionnaire d'exception à gérer "Impossible de rediriger après l'envoi des en-têtes HTTP". cette erreur comme indiqué ci-dessous 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");}
1
SamsonOnNet

J'ai résolu le problème en utilisant: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); Au lieu de Response.Redirect.

1
utilsit

Si vous obtenez une redirection impossible après l'envoi des en-têtes HTTP, essayez le code ci-dessous. 

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
0
Aashish Garg

Erreur Impossible de rediriger une fois les en-têtes HTTP envoyés.

System.Web.HttpException (0x80004005): Impossible de rediriger une fois les en-têtes HTTP envoyés.

Suggestion

Si nous utilisons asp.net mvc et que nous travaillons sur le même contrôleur et que nous redirigeons vers une action différente, vous n'avez pas besoin d'écrire 
Response.Redirect ("NomAction", "NomContrôleur");
il est préférable d'utiliser uniquement 
return RedirectToAction ("ActionName");
ou 
return View ("ViewName");

0
Ram Samuj

Vous pouvez également utiliser le code mentionné ci-dessous 

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
0
Dipanki Jadav

La fonction de redirection fonctionne probablement en utilisant l'en-tête http 'refresh' (et peut-être aussi en utilisant un code 30X). Une fois que les en-têtes ont été envoyés au client, le serveur n'a aucun moyen d'ajouter cette commande de redirection, car il est trop tard.

0
Nathan

Assurez-vous de ne pas utiliser les méthodes de Responses telles que Response.Flush(); avant votre partie de redirection.

0
1_bug