it-swarm.com.de

Warum erhalte ich die Meldung "Umleitung nach dem Senden von HTTP-Headern nicht möglich", wenn ich Response.Redirect () anrufe?

Wenn ich Response.Redirect(someUrl) anrufe, erhalte ich eine HttpException: "Umleitung nicht möglich, nachdem HTTP-Header gesendet wurden".

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

78
Samuel Meacham

Gemäß der MSDN-Dokumentation für Response.Redirect(string url) wird eine HttpException ausgelöst, wenn "nach dem Senden der HTTP-Header eine Umleitung versucht wird". Da Response.Redirect(string url) den HTTP-Antwortheader "Location" ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ) verwendet, führt der Aufruf dazu, dass die Header an den Client gesendet werden. Dies bedeutet, dass Sie die HttpException erhalten, wenn Sie sie ein zweites Mal aufrufen oder wenn Sie die Header auf andere Weise gesendet haben.

Eine Möglichkeit, mehrmals vor dem Aufruf von Response.Redirect () zu schützen, ist die Response.IsRequestBeingRedirected-Eigenschaft (bool) vor dem Aufruf zu prüfen.

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

Wenn Sie überhaupt Inhalte an den Client senden, wurden die HTTP-Header bereits gesendet. Ein Response.Redirect()-Aufruf funktioniert, indem in den Kopfzeilen spezielle Informationen gesendet werden, durch die der Browser nach einer anderen URL fragt. 

Da die Header bereits gesendet wurden, kann asp.net nicht das tun, was Sie möchten (die Header ändern)

Sie können dies umgehen, indem Sie a) entweder die Umleitung durchführen, bevor Sie irgendetwas anderes tun, oder b) versuchen Sie, Response.Buffer = true, bevor Sie etwas anderes tun, um sicherzustellen, dass keine Ausgabe an den Client gesendet wird, bis die gesamte Seite ausgeführt wurde.

17
Philip Rieck

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

Wenn Sie Response.Write() bereits aufgerufen oder einige Header gesetzt haben, ist es für eine Weiterleitung zu spät. Sie können versuchen, Response.Headers.Clear() vor der Umleitung aufzurufen, um zu sehen, ob dies hilft.

8
Mark Cidade

Prüfen Sie einfach, 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 Standardpuffergröße überschreitet (in diesem Fall werden die Header selbst gelöscht, wodurch die Header gesendet werden).
3
Dhananjay

Mit return RedirectPermanent(myUrl) arbeitete ich für mich

2
Vasilis

Hierfür gibt es eine einfache Antwort: Sie haben etwas anderes ausgegeben, z. B. Text oder etwas, das sich auf die Ausgabe Ihrer Seite bezieht, bevor Sie den Header senden. Dies beeinflusst, warum Sie diesen Fehler erhalten. 

Überprüfen Sie einfach Ihren Code auf mögliche Ausgaben, oder Sie können den Header oben auf Ihre Methode setzen, damit er zuerst gesendet wird.

1
DucDigital

Wenn Sie versuchen, umzuleiten, nachdem die Header gesendet wurden (wenn Sie zum Beispiel eine Fehlerumleitung von einer teilweise generierten Seite durchführen), können Sie ein Client-Javascript senden (location.replace oder location.href usw.) zu einer beliebigen URL umleiten. Das hängt natürlich davon ab, welcher HTML-Code bereits gesendet wurde.

1
Brad

Mein Problem wurde behoben, indem der Exception-Handler hinzugefügt wurde, der behandelt wurde. Dieser Fehler wird unter dem folgenden Code angezeigt

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
SamsonOnNet

Ich habe das Problem gelöst mit: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); Anstelle von Response.Redirect.

1
utilsit

Wenn Sie nach dem Senden von HTTP-Headern nicht umleiten können, versuchen Sie den folgenden Code. 

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

Error Kann nicht umgeleitet werden, nachdem HTTP-Header gesendet wurden.

System.Web.HttpException (0x80004005): Umleitung nach dem Senden von HTTP-Headern nicht möglich.

Vorschlag

Wenn wir asp.net mvc verwenden und auf demselben Controller arbeiten und zu verschiedenen Aktionen umleiten, müssen Sie nicht schreiben. 
Response.Redirect ("ActionName", "ControllerName");
es ist besser nur zu verwenden 
return RedirectToAction ("ActionName");
oder 
return View ("ViewName");

0
Ram Samuj

Sie können auch den unten genannten Code verwenden 

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

Die Umleitungsfunktion funktioniert wahrscheinlich mit dem http-Header 'Refresh' (und möglicherweise auch mit einem 30X-Code). Nachdem die Header an den Client gesendet wurden, kann der Server den Umleitungsbefehl nicht mehr anhängen. Dies ist zu spät.

0
Nathan

Stellen Sie sicher, dass Sie vor dem Umleitungsteil keine Responses-Methoden wie Response.Flush(); verwenden.

0
1_bug