Dlaczego dostaję "nie mogę przekierować po wysłaniu nagłówków HTTP", gdy wywołuję odpowiedź.Redirect()?

Kiedy wywołuję Response.Redirect(someUrl) otrzymuję HttpException: "nie można przekierować po wysłaniu nagłówków HTTP".

Po co mi to? Jak mogę rozwiązać ten problem?
Author: George Stocker, 2008-10-02

15 answers

Zgodnie z dokumentacją MSDN dla Response.Redirect(string url), spowoduje to wywołanie HttpException, gdy "próba przekierowania zostanie podjęta po wysłaniu nagłówków HTTP". Ponieważ Response.Redirect(string url) używa nagłówka odpowiedzi Http " Location "( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), wywołanie go spowoduje wysłanie nagłówków do klienta. Oznacza to, że jeśli wywołasz go po raz drugi lub jeśli wywołasz go po spowodowaniu wysłania nagłówków w inny sposób, otrzymasz HttpException.

Jeden ze sposobów ochrony przed wywołaniem odpowiedzi.Redirect () wielokrotnie polega na sprawdzeniu właściwości Response.IsRequestBeingRedirected (bool) przed jej wywołaniem.

// 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");
 113
Author: Samuel Meacham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 20:25:23

Po wysłaniu dowolnej zawartości do klienta, nagłówki HTTP zostały już wysłane. Wywołanie Response.Redirect() działa poprzez wysyłanie specjalnych informacji w nagłówkach, które sprawiają, że przeglądarka prosi o inny adres URL.

Ponieważ nagłówki zostały już wysłane, asp.net can ' t do what you want (Modyfikuj nagłówki)

Możesz to obejść, wykonując przekierowanie, zanim zrobisz cokolwiek innego, lub B) spróbuj użyć Response.Buffer = true, zanim zrobisz cokolwiek innego, aby upewnić się, że żadne wyjście nie zostanie wysłane do klienta, dopóki cała strona nie zostanie wykonana.

 17
Author: Philip Rieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-04 00:16:55

Przekierowanie może się zdarzyć tylko wtedy, gdy pierwsza linia w wiadomości HTTP to " HTTP/1.x 3xx Redirect Reason".

Jeśli już wywołałeś Response.Write() lub Ustawiłeś nagłówki, będzie za późno na przekierowanie. Możesz spróbować zadzwonić Response.Headers.Clear() przed przekierowaniem, aby sprawdzić, czy to pomaga.

 7
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 20:29:52

Wystarczy sprawdzić, czy ustawiono opcję buforowania na false (domyślnie jest to true). Na odpowiedź.redirect to work,

  1. buforowanie powinno być prawdziwe,
  2. nie powinieneś wysyłać więcej danych za pomocą odpowiedzi.zapis, który przekracza domyślny rozmiar bufora (w takim przypadku sam się spłukuje, powodując wysłanie nagłówków), dlatego nie pozwala na przekierowanie.
 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 09:27:54

Za pomocą return RedirectPermanent(myUrl) pracował dla mnie

 2
Author: Vasilis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 08:45:38

Jest jedna prosta odpowiedź na to: Przed wysłaniem nagłówka wypisujesz coś innego, na przykład tekst lub cokolwiek związanego z plikiem wyjściowym ze strony. Ma to wpływ na to, dlaczego pojawia się ten błąd.

Po prostu sprawdź swój kod pod kątem możliwego wyjścia lub możesz umieścić nagłówek na swojej metodzie, aby został wysłany jako pierwszy.

 1
Author: DucDigital,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-14 03:07:52

Jeśli próbujesz przekierować po wysłaniu nagłówków (jeśli na przykład robisz przekierowanie błędu z częściowo Wygenerowanej strony), możesz wysłać klientowi Javascript (lokalizacja.zastąp lub lokalizację.href itp.) przekierowanie na dowolny adres URL. Oczywiście zależy to od tego, jaki HTML został już wysłany.

 1
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 21:29:08

Mój problem został rozwiązany przez dodanie obsługi wyjątków do obsługi "Nie można przekierować po wysłaniu nagłówków HTTP". ten błąd jak pokazano poniżej kod

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
Author: SamsonOnNet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-08 12:02:55

Rozwiązałem problem używając: Odpowiedź.RedirectToRoute ("CultureEnabled", RouteData.Wartości); zamiast odpowiedzi.Przekierowanie.

 1
Author: utilsit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-31 16:43:21

Funkcja redirect prawdopodobnie działa przy użyciu nagłówka http 'refresh' (i może również przy użyciu kodu 30X). Gdy nagłówki zostaną wysłane do klienta, nie ma sposobu, aby serwer dopisał to polecenie przekierowania, jest za późno.

 0
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 09:07:35

Jeśli nie możesz przekierować po wysłaniu nagłówków HTTP, wypróbuj poniższy kod.

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
 0
Author: Aashish Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 17:04:51

Upewnij się, że nie używasz metod Responses', takich jak Response.Flush(); przed częścią przekierowującą.

 0
Author: 1_bug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-13 12:27:42

Możesz również użyć poniższego kodu

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
 0
Author: Dipanki Jadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 04:21:16

Błąd Nie można przekierować po wysłaniu nagłówków HTTP.

System.Www.HttpException( 0x80004005): nie można przekierować po wysłaniu nagłówków HTTP.

sugestia

Jeśli użyjemy asp.net mvc i praca na tym samym kontrolerze i przekierowanie do innej akcji wtedy nie trzeba pisać..
ODPOWIEDŹ.Redirect ("ActionName", "ControllerName");
lepiej używać tylko
return { RedirectToAction ("ActionName");
or
return View ("ViewName");

 0
Author: Ram Samuj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 13:07:45

Są 2 sposoby, aby to naprawić:

  1. Wystarczy dodać return Oświadczenie po Response.Redirect(someUrl); ( jeśli podpis metody nie jest "void", musisz oczywiście zwrócić ten" typ" ) tak więc:

    Odpowiedź.Redirect ("Login.aspx");

    Return;

Uwaga zwrot pozwala serwerowi na wykonanie przekierowania...bez niego serwer chce kontynuować wykonywanie reszty kodu...

  1. Make your Response.Redirect(someUrl) The LAST executed statement in the metoda rzucająca wyjątek. Zastąp Response.Redirect(someUrl) zmienną łańcuchową o nazwie "someUrl"i ustaw ją na lokalizację przekierowania... jak następuje:

//......some code

string someUrl = String.Empty

.....trochę logiki

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

......więcej kodu

// przenieś swoją odpowiedź.Przekierowanie do tutaj (koniec metody):

Response.Redirect(someUrl);
return; 
 -1
Author: user9150083,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 16:37:16