Frage Warum bekomme ich "Ich kann nicht umleiten, nachdem HTTP-Header gesendet wurden", wenn ich Response.Redirect () aufruft?


Wenn ich anrufe Response.Redirect(someUrl) Ich bekomme eine HttpException: "Kann nicht umleiten, nachdem HTTP-Header gesendet wurden".

Warum bekomme ich das? Und wie kann ich dieses Problem beheben?


76
2017-10-01 20:22


Ursprung


Antworten:


Laut der MSDN-Dokumentation für Response.Redirect(string url), wird eine HttpException ausgelöst, wenn "eine Umleitung versucht wird, nachdem die HTTP-Header gesendet wurden". Schon seit Response.Redirect(string url) verwendet den HTTP-Header "Location" (http://en.wikipedia.org/wiki/HTTP_headers#Responses), werden die Header an den Client gesendet. Dies bedeutet, dass Sie die HttpException erhalten, wenn Sie es ein zweites Mal aufrufen, oder wenn Sie es aufrufen, nachdem Sie die Header auf eine andere Weise gesendet haben.

Eine Möglichkeit, mehrere Male Response.Redirect () zu vermeiden, besteht darin, das Kontrollkästchen zu aktivieren Response.IsRequestBeingRedirected Eigenschaft (bool) vor dem Aufruf.

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

112
2017-10-01 20:25



Sobald Sie überhaupt Inhalte an den Client gesendet haben, wurden die HTTP-Header bereits gesendet. EIN Response.Redirect() Der Anruf funktioniert, indem spezielle Informationen in den Kopfzeilen gesendet werden, die den Browser nach einer anderen URL fragen lassen.

Da die Header bereits gesendet wurden, kann asp.net nicht tun, was Sie wollen (ändern Sie die Header)

Sie können dies umgehen, indem Sie a) entweder die Weiterleitung ausführen, bevor Sie etwas anderes tun, oder b) versuchen, sie zu verwenden Response.Buffer = true Bevor Sie etwas anderes tun, stellen Sie sicher, dass keine Ausgabe an den Client gesendet wird, bis die gesamte Seite ausgeführt wurde.


16
2017-10-01 20:27



Eine Umleitung kann nur stattfinden, wenn die erste Zeile in einer HTTP-Nachricht "HTTP/1.x 3xx Redirect Reason".

Wenn du schon angerufen hast Response.Write() oder einige Header setzen, es ist zu spät für eine Weiterleitung. Sie können versuchen, anzurufen Response.Headers.Clear() vor der Umleitung, um zu sehen, ob das hilft.


7
2017-10-01 20:24



Überprüfen Sie, ob Sie die Pufferoption auf "false" gesetzt haben (standardmäßig "true"). Für response.redirect zur Arbeit,

  1. Pufferung sollte wahr sein,
  2. Sie sollten nicht mehr Daten mit response.write gesendet haben, die die Standard-Puffergröße überschreitet (in diesem Fall wird es sich selbst löschen, wodurch die Header gesendet werden), so dass Sie nicht umleiten können.

3
2018-05-01 09:27



Verwenden return RedirectPermanent(myUrl) hat für mich gearbeitet


2
2018-03-23 08:45



Dafür gibt es eine einfache Antwort: Sie haben etwas anderes ausgegeben, z. B. Text oder etwas, das mit der Ausgabe auf Ihrer Seite in Zusammenhang steht, bevor Sie die Kopfzeile senden. Dies beeinflusst, warum Sie diesen Fehler erhalten.

Überprüfen Sie einfach Ihren Code auf mögliche Ausgabe oder Sie können den Header oben auf Ihre Methode setzen, so dass es zuerst gesendet wird.


1
2018-01-14 03:07



Mein Problem wurde gelöst, indem der Exception-Handler hinzugefügt wurde "Nach dem Senden von HTTP-Headern kann nicht umgeleitet werden". Dieser Fehler ist wie unten gezeigt

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
2018-01-08 12:02



Ich löste das Problem mit: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); anstelle von Response.Redirect.


1
2017-10-31 16:43