88 votes

Pourquoi est-ce que j'obtiens "Cannot redirect after HTTP headers have been sent" lorsque j'appelle Response.Redirect() ?

Quand j'appelle Response.Redirect(someUrl) J'obtiens l'exception HttpException suivante :

Impossible de rediriger après l'envoi des en-têtes HTTP.

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

122voto

Samuel Meacham Points 5058

Selon la documentation MSDN pour Response.Redirect(string url) Si l'on utilise la fonction de redirection, une exception HttpException sera levée si "une redirection est tentée après l'envoi des en-têtes HTTP". Puisque 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 l'appelez une deuxième fois, ou si vous l'appelez après avoir fait en sorte que les en-têtes soient envoyés d'une autre manière, vous obtiendrez une exception HttpException.

Une façon de se prémunir contre le fait d'appeler Response.Redirect() plusieurs fois est de vérifier l'adresse de l'utilisateur. 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");

2 votes

Ouaip, exactement. Cela se produit assez facilement avec ASP.NET MVC 4 et les filtres d'exception, etc. Vous ne pouvez pas non plus modifier le code de statut de réponse HTTP une fois qu'une redirection 301/302 a été émise.

0 votes

J'ai résolu le problème en rendant toutes les propriétés de ma page "statiques".

5 votes

Rendre vos propriétés statiques est une solution dangereuse

17voto

Philip Rieck Points 21405

Dès que vous envoyez un contenu quelconque au client, les en-têtes HTTP ont déjà été envoyés. A Response.Redirect() fonctionne en envoyant des informations spéciales dans les en-têtes qui font que le navigateur demande une URL différente.

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

Vous pouvez contourner ce problème a) en effectuant la redirection avant de faire quoi que ce soit d'autre, ou b) en essayant d'utiliser la fonction Response.Buffer = true avant de faire quoi que ce soit d'autre, pour s'assurer qu'aucune sortie n'est envoyée au client tant que l'ensemble de la page n'a pas été exécuté.

0 votes

Pour moi, ça ne marche pas. J'utilise .NET, MVC et j'ai un appel dans la méthode du contrôleur. Je reçois toujours une exception, bien que la redirection se fasse.

8voto

Mark Cidade Points 53945

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éfinir 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 aide.

0 votes

J'utilise return RedirectToAction("Logout", "Authentication"); et j'obtiens cette erreur

1 votes

Lorsque j'ai essayé d'effacer les en-têtes, j'ai obtenu System.PlatformNotSupportedException : Cette opération nécessite le mode pipeline intégré de IIS.

3voto

Vérifiez simplement si vous avez réglé l'option de mise en mémoire tampon sur false (par défaut, elle est true). Pour que response.redirect fonctionne,

  1. La mise en mémoire tampon devrait être vraie,
  2. vous n'auriez pas dû envoyer plus de données en utilisant response.write qui dépasse la taille de la mémoire tampon par défaut (dans ce cas, il se purgera lui-même, ce qui entraînera l'envoi des en-têtes), ce qui vous empêchera de procéder à une redirection.

1 votes

Response.BufferOutput = true; dans l'action, dans le contrôleur ?

3voto

Vasilis Points 41

Utilisation de return RedirectPermanent(myUrl) a fonctionné pour moi

0 votes

J'ai une action et un contrôleur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X