Wenn ich Response.Redirect(someUrl)
anrufe, erhalte ich die folgende HttpException:
Kann nicht umleiten, nachdem HTTP-Header gesendet wurden.
Warum bekomme ich das? Und wie kann ich dieses Problem beheben?
quelle
Wenn ich Response.Redirect(someUrl)
anrufe, erhalte ich die folgende HttpException:
Kann nicht umleiten, nachdem HTTP-Header gesendet wurden.
Warum bekomme ich das? Und wie kann ich dieses Problem beheben?
Gemäß 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". Da Response.Redirect(string url)
der HTTP-Antwortheader "Location" ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ) verwendet wird, werden die Header beim Aufrufen 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 andere Weise gesendet haben.
Eine Möglichkeit, sich vor dem mehrmaligen Aufrufen von Response.Redirect () zu schützen, besteht darin, die Response.IsRequestBeingRedirected
Eigenschaft (bool) vor dem Aufruf zu überprü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");
endResponse
) auf true gesetzt ist."Response.IsRequestBeingRedirected
ist es falsch und ich erhalte immer noch dieselbe Ausnahme (innerhalb derApplication_EndRequest
Ereignismethode in Global.asax). Ich kann nicht verstehen warum.Sobald Sie Inhalte an den Client gesendet haben, wurden die HTTP-Header bereits gesendet. Ein
Response.Redirect()
Anruf sendet spezielle Informationen in den Kopfzeilen, die den Browser dazu veranlassen, nach einer anderen URL zu fragen.Da die Header bereits gesendet wurden, kann asp.net nicht das tun, was Sie wollen (ändern Sie die Header).
Sie können dies umgehen, indem Sie a) entweder die Umleitung
Response.Buffer = true
ausführen , bevor Sie etwas anderes tun, oder b) versuchen, sie zu verwenden, bevor Sie etwas anderes tun, um sicherzustellen, dass keine Ausgabe an den Client gesendet wird, bis die gesamte Seite ausgeführt ist.quelle
Eine Umleitung kann nur erfolgen, wenn die erste Zeile in einer HTTP-Nachricht "
HTTP/1.x 3xx Redirect Reason
" lautet .Wenn Sie bereits
Response.Write()
einige Header aufgerufen oder festgelegt haben, ist es für eine Weiterleitung zu spät. Sie können versuchen,Response.Headers.Clear()
vor der Umleitung anzurufen, um festzustellen, ob dies hilfreich ist.quelle
return RedirectToAction("Logout", "Authentication");
und ich bekomme diesen FehlerÜberprüfen Sie einfach, ob Sie die Pufferoption auf false gesetzt haben (standardmäßig true). Damit response.redirect funktioniert,
quelle
Response.BufferOutput = true;
in der Aktion, in Controller?Verwenden
return RedirectPermanent(myUrl)
hat bei mir funktioniertquelle
Sie können auch den unten genannten Code verwenden
quelle
Hierfür gibt es eine einfache Antwort: Sie haben etwas anderes ausgegeben, z. B. Text oder etwas, das mit der Ausgabe Ihrer Seite zusammenhängt, bevor Sie Ihren Header senden. Dies wirkt sich darauf aus, warum Sie diesen Fehler erhalten.
Überprüfen Sie einfach Ihren Code auf mögliche Ausgaben, oder setzen Sie den Header über Ihre Methode, damit er zuerst gesendet wird.
quelle
Wenn Sie versuchen, nach dem Senden der Header umzuleiten (wenn Sie beispielsweise eine Fehlerumleitung von einer teilweise generierten Seite durchführen), können Sie Client-Javascript senden (location.replace oder location.href usw.). um zu einer beliebigen URL umzuleiten. Das hängt natürlich davon ab, welches HTML bereits gesendet wurde.
quelle
Mein Problem wurde behoben, indem der Exception Handler hinzugefügt wurde, um "Kann nicht umleiten, nachdem HTTP-Header gesendet wurden" zu behandeln. Dieser Fehler wie unten gezeigt
quelle
Ich habe das Problem gelöst mit: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); anstelle von Response.Redirect.
quelle
Fehler Kann nicht umgeleitet werden, nachdem HTTP-Header gesendet wurden.
System.Web.HttpException (0x80004005): Kann nicht umgeleitet werden, nachdem HTTP-Header gesendet wurden.
Vorschlag
Wenn wir asp.net mvc verwenden und auf demselben Controller arbeiten und zu einer anderen Aktion umleiten, müssen Sie nicht schreiben.
Response.Redirect ("ActionName", "ControllerName");
Es ist besser, nur
return RedirectToAction ("ActionName") zu verwenden.
oder
return View ("ViewName");
quelle
Die Umleitungsfunktion funktioniert wahrscheinlich mithilfe des http-Headers 'refresh' (und möglicherweise auch mithilfe eines 30X-Codes). Sobald die Header an den Client gesendet wurden, kann der Server diesen Umleitungsbefehl nicht mehr anhängen. Es ist zu spät.
quelle
Wenn Sie nach dem Senden von HTTP-Headern keine Weiterleitung erhalten können, versuchen Sie diesen folgenden Code.
quelle
Stellen Sie sicher, dass Sie die
Response
Methoden von s nicht wieResponse.Flush();
vor dem Umleiten verwenden.quelle
Es gibt zwei Möglichkeiten, dies zu beheben:
Fügen Sie einfach eine
return
Anweisung nach Ihrer hinzuResponse.Redirect(someUrl);
(wenn die Methodensignatur nicht "void" ist, müssen Sie diesen "Typ" natürlich zurückgeben), wie folgt:Response.Redirect ("Login.aspx");
Rückkehr;
Beachten Sie, dass die Rückgabe es dem Server ermöglicht, die Umleitung durchzuführen. Ohne diese Umleitung möchte der Server den Rest Ihres Codes weiter ausführen.
Response.Redirect(someUrl)
die zuletzt ausgeführte Anweisung in der Methode, die die Ausnahme auslöst. Ersetzen Sie IhreResponse.Redirect(someUrl)
durch eine Zeichenfolge VARIABLE mit dem Namen "someUrl" und setzen Sie sie auf die Umleitungsposition ... wie folgt://......some code
..... etwas Logik
...... mehr Code
// BEWEGE deine Antwort. Leite zu HIER um (das Ende der Methode):
quelle
return
tun? Dasreturn
definiert nur, dass die Methode abgeschlossen ist. Wenn jedoch kein Code mehr vorhanden ist, ist die Methode trotzdem abgeschlossen. Und das Speichern einer URL in einer Variablen ändert nichts, ich meine: Warum sollte es? Die Zeichenfolge ist dieselbe. Das kompilierte Ding macht keinen Unterschied zwischen einem String und einer Variablen, die einen String enthält ...: Denken Sie darüber nachx = 5
, also ist x 5, aber 5 ist auch 5. Selbst 10/2 wäre 5 ... macht auch keinen Unterschied