Warum erhalte ich „Kann nicht umleiten, nachdem HTTP-Header gesendet wurden“, wenn ich Response.Redirect () aufrufen?

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

Frage

Als ich Response.Redirect(someUrl) nennen erhalte ich eine Httpexception:. „Kann nicht umleiten, nachdem HTTP-Header gesendet wurden“

Warum erhalte ich diese? Und wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Nach der MSDN-Dokumentation für Response.Redirect(string url), wird eine Httpexception werfen, wenn „eine Umleitung versucht wird, nachdem die HTTP-Header gesendet wurden“. Da Response.Redirect(string url) verwendet die Http "Location" Response-Header ( http://en.wikipedia.org/wiki/ HTTP_headers # Antworten ), nannte es werden die Header dazu führen, an den Client gesendet werden. Das bedeutet, dass, wenn Sie es ein zweites Mal anrufen, oder wenn Sie es nennen, nachdem Sie die Header verursacht haben auf andere Weise gesendet werden, werden Sie die Httpexception erhalten.

Eine Möglichkeit zum Schutz vor Aufruf Response.Redirect () mehrere Male ist 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");

Andere Tipps

Wenn Sie überhaupt an den Kunden, jeden Inhalt senden, haben die HTTP-Header bereits gesendet. Ein Response.Redirect() Anruf arbeitet durch spezielle Informationen in den Header zu senden, die den Browser für eine andere URL fragen machen.

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

Sie können durch ein dieses Problem umgehen) entweder die Redirect zu tun, bevor Sie etwas anderes tun, oder b) versuchen Response.Buffer = true verwenden, bevor Sie irgendetwas anderes tun, um sicherzustellen, dass keine Ausgabe an den Client gesendet wird, bis die ganze Seite erfolgt ausgeführt wird.

Ein Redirect kann nur geschehen, wenn die erste Zeile in einer HTTP-Nachricht ist "HTTP/1.x 3xx Redirect Reason".

Wenn Sie bereits Response.Write() oder setzen einige Header genannt, wird es für eine Umleitung zu spät sein. Sie können versuchen, Response.Headers.Clear() vor dem Redirect Aufruf, um zu sehen, ob das hilft.

Just überprüfen, ob Sie die Pufferung Option auf false gesetzt haben (standardmäßig seine true). Für response.redirect zu arbeiten,

  1. Buffering sollte wahr sein,
  2. Sie sollten nicht mehr Daten gesendet haben response.write verwendet, die die Standardpuffergröße übersteigt (in diesem Fall ist es spült sich die Header verursacht gesendet werden) daher Verbieten Sie umleiten.

Mit return RedirectPermanent(myUrl) für mich gearbeitet

Es gibt eine einfache Antwort auf diese: Sie haben sonst Ausgabe etwas gewesen, wie Text, oder irgendetwas zur Ausgabe von Ihrer Seite verbunden ist, bevor Sie den Header senden. Diese beeinflussen, warum Sie diesen Fehler erhalten.

Überprüfen Sie einfach den Code für posible Ausgabe oder Sie den Header auf Ihre Methode setzen können, so wird es zuerst gesendet.

Wenn Sie umleiten wollen, nachdem die Header gesendet wurden (wenn zum Beispiel Sie tun, ein Fehler umleiten aus einem teilweise generierte Seite), können einige Client Javascript (location.replace oder location.href senden, etc.) umgeleitet werden, was auch immer URL Sie wollen. Natürlich, das hängt davon ab, welche HTML bereits herabgesandt worden ist.

wurde mein Problem, indem Sie die Exception Handler behoben zu handhaben „Umleiten kann nicht nach dem HTTP-Header gesendet wurde“. Dieser Fehler wie unten gezeigte 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");}

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

Die Umleitungsfunktion funktioniert wahrscheinlich unter Verwendung der ‚Refresh‘ http-Header (und vielleicht einen 30X-Code als auch verwenden). Sobald die Header an den Client gesendet wurden, gibt es nicht Art und Weise für den Server, Redirect Befehl anhängen, es zu spät ist.

Wenn Sie erhalten umleiten kann nicht nach dem HTTP-Header wurden dann versuchen, diese unter Code gesendet.

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

Seien Sie sicher, dass Sie nicht Responses' Methoden wie Response.Flush(); vor Ihrer Umleitung Teil verwenden Sie.

Sie können auch unten genannten Code verwenden

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

Fehler Kann nicht umleiten, nachdem HTTP-Header gesendet wurden.

System.Web.HttpException (0x80004005):. Kann nicht nach HTTP-Header umleiten gesendet wurden

Vorschlag
Wenn wir asp.net Mvc und arbeiten an demselben Controller und Umleitung auf andere Aktion verwenden, dann brauchen Sie nicht ..
Response.Redirect ( „Action“, „controller“) zu schreiben; < br> seine besser nutzen nur
Rückkehr RedirectToAction ( "Action"); oder in Ansicht zurückkehren ( "Viewname");

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. Nur eine return Anweisung nach dem Response.Redirect(someUrl); hinzufügen (Wenn die Methode Unterschrift nicht „leer“ ist, werden Sie zurückkommen müssen, dass „Typ“, natürlich) wie so:

    Response.Redirect ( "Login.aspx");

    zurück;

die Rückkehr Hinweis der Server ermöglicht die Umleitung ... ohne es auszuführen, wird der Server will den Rest des Codes, um fortzufahren Ausführen ...

  1. Machen Sie Ihren Response.Redirect(someUrl) der zuletzt ausgeführten Anweisung in der Methode, die die Ausnahme wirft. Ersetzen Sie Ihre Response.Redirect(someUrl) mit einem String-Variable mit dem Namen „someUrl“, und setzen Sie sich auf die Umleitung Lage ... wie folgt:

//......some code

string someUrl = String.Empty

..... einige Logik

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

...... mehr Code

// MOVE Ihre Response.Redirect zu HIER (das Ende des Verfahrens):

Response.Redirect(someUrl);
return; 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top