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?
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");
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.
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.
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,
Utiliser return RedirectPermanent(myUrl)
a fonctionné pour moi
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.
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é.
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");}
J'ai résolu le problème en utilisant: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); Au lieu de Response.Redirect.
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);
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");
Vous pouvez également utiliser le code mentionné ci-dessous
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
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.
Assurez-vous de ne pas utiliser les méthodes de Response
s telles que Response.Flush();
avant votre partie de redirection.