Pourquoi est-ce que je reçois «Ne peut pas rediriger après l'envoi des en-têtes HTTP» lorsque j'appelle Response.Redirect ()?

StackOverflow https://stackoverflow.com/questions/159523

Question

Lorsque j'appelle Response.Redirect (someUrl) , je reçois une exception HttpException: "Impossible de rediriger les redirection après l'envoi des en-têtes HTTP".

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

Était-ce utile?

La solution

Selon la documentation MSDN pour Response.Redirect (string url) , il générera une exception HttpException lorsque "une redirection est tentée après l'envoi des en-têtes HTTP". Depuis Response.Redirect (string url) utilise le Http "Location". en-tête de réponse ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ) Si vous l'appelez, les en-têtes seront envoyés au client. Cela signifie que si vous l'appelez une seconde fois ou après l'avoir envoyé d'une autre manière, vous obtiendrez l'exception HttpException.

Un moyen de se prémunir contre l'appel de 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");

Autres conseils

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 autre URL.

Comme 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 quoi que ce soit, pour vous assurer qu'aucune sortie est envoyé au client jusqu'à l'exécution complète de la page.

Une redirection ne peut se produire que si la première ligne d'un message HTTP est " HTTP / 1.x Raison de la redirection 3xx ".

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,

  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, ce qui dépasse la taille de la mémoire tampon par défaut (dans ce cas, il se videra lui-même et les en-têtes seront envoyés), ce qui vous interdisera de rediriger.

Utilisation return RedirectPermanent (myUrl) a fonctionné pour moi

Il existe une réponse simple à cela: Avant d'envoyer votre en-tête, vous avez généré quelque chose d'autre, tel que du texte ou tout ce qui concerne la sortie de votre page. Cela affecte la raison pour laquelle 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 pour qu'il soit envoyé en premier.

Si vous essayez de rediriger les en-têtes après leur envoi (par exemple, si vous effectuez une redirection d’erreur depuis 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. "Ne peut pas être redirigé 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.

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 plus aucun moyen d'ajouter cette commande de redirection, car il est trop tard.

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);

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

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

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

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

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, il n’est pas nécessaire d’écrire.
Response.Redirect (" ActionName " ;, " ControllerName &); Il est préférable d’utiliser uniquement return RedirectToAction ("ActionName");
ou
return View ("ViewName");

Il existe deux façons de résoudre ce problème:

  1. Ajoutez simplement une instruction return après votre Response.Redirect (someUrl); (si la signature de la méthode n'est pas "vide", vous devrez renvoyer ce "type", bien sûr) comme tel:

    Response.Redirect ("Login.aspx");

    retour;

Notez que le retour autorise le serveur à effectuer la redirection ... sans cela, le serveur souhaite continuer à exécuter le reste de votre code ...

  1. Faites de votre Response.Redirect (someUrl) la dernière instruction exécutée dans la méthode qui lève l'exception. Remplacez Response.Redirect (someUrl) par la chaîne VARIABLE nommée "someUrl" et définissez-la à l'emplacement de redirection ... comme suit:

// ...... du code

string someUrl = String.Empty

..... quelque logique

if (x=y)
{
    // comment (original location of Response.Redirect("Login.aspx");)
    someUrl = "Login.aspx";
}

...... plus de code

// DÉPLACEZ votre Response.Redirect vers HERE (la fin de la méthode):

Response.Redirect(someUrl);
return; 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top