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 ?

1voto

Ram Samuj Points 11

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

System.Web.HttpException (0x80004005) : Impossible de rediriger après l'envoi des en-têtes HTTP.

Suggestion

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

0 votes

J'utilise l'ActionName d'un autre ControllerName ?

1voto

SamsonOnNet Points 1

Mon problème a été résolu en ajoutant le gestionnaire d'exception pour gérer "Cannot redirect after HTTP headers have been sent". Cette erreur est représentée par le code suivant

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

0voto

Nathan Reed Points 3192

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

0voto

Aashish Garg Points 1

Si vous obtenez Cannot redirect after HTTP headers have been sent, essayez le code ci-dessous.

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

-3voto

user9150083 Points 1

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

  1. Il suffit d'ajouter un return après votre Response.Redirect(someUrl); ( si la signature de la méthode n'est pas "void", vous devrez retourner ce "type", bien sûr ) ainsi :

    Response.Redirect("Login.aspx") ;

    retour ;

Notez que le retour permet au serveur d'effectuer la redirection... sans lui, le serveur veut continuer à exécuter le reste de votre code...

  1. Faites votre Response.Redirect(someUrl) la DERNIÈRE instruction exécutée dans la méthode qui déclenche l'exception. Remplacez votre Response.Redirect(someUrl) avec une chaîne VARIABLE nommée "someUrl", et la définir sur l'emplacement de la redirection... comme suit :

//......some code

string someUrl = String.Empty

.....some logic

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

......more code

// Déplacez votre Response.Redirect vers ICI (la fin de la méthode) :

Response.Redirect(someUrl);
return;

0 votes

Désolé, mais cela n'a aucun sens pour moi. Que devrait faire (dans une méthode à retour nul) cette redondante return faire ? Le site return définit seulement que la méthode est terminée. Mais quand il n'y a plus de code, la méthode est quand même terminée. Et le fait de stocker une url dans une variable ne change rien, je veux dire : pourquoi le ferait-on ? La chaîne est la même. La chose compilée ne fait aucune différence entre une chaîne de caractères et une variable contenant une chaîne de caractères... : pensez à x = 5 Donc x est 5 mais 5 est aussi 5. Même 10/2 serait 5... cela ne fait aucune différence.

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