Kiedy dzwonię Response.Redirect(someUrl)
, otrzymuję następujący HttpException:
Nie można przekierować po wysłaniu nagłówków HTTP.
Dlaczego to rozumiem? Jak mogę rozwiązać ten problem?
źródło
Kiedy dzwonię Response.Redirect(someUrl)
, otrzymuję następujący HttpException:
Nie można przekierować po wysłaniu nagłówków HTTP.
Dlaczego to rozumiem? Jak mogę rozwiązać ten problem?
Zgodnie z dokumentacją MSDN dla Response.Redirect(string url)
, zgłosi HttpException, gdy „podjęto próbę przekierowania 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 tym, jak spowodowałeś wysłanie nagłówków w inny sposób, otrzymasz HttpException.
Jednym ze sposobów na uniknięcie wielokrotnego wywoływania Response.Redirect () jest sprawdzenie Response.IsRequestBeingRedirected
właściwości (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");
endResponse
) ustawionym na true”.Response.IsRequestBeingRedirected
jest fałszywa i nadal otrzymuję ten sam wyjątek (wewnątrzApplication_EndRequest
metody zdarzenia w Global.asax). Nie rozumiem dlaczego.Gdy w ogóle wyślesz jakąkolwiek zawartość do klienta, nagłówki HTTP zostały już wysłane. ZA
Response.Redirect()
Wezwanie działa poprzez wysłanie specjalnego informacje w nagłówkach, które sprawiają, że przeglądarka poprosić o inny URL.Ponieważ nagłówki zostały już wysłane, asp.net nie może robić tego, co chcesz (modyfikować nagłówki)
Możesz obejść ten problem, wykonując a) przekierowanie, zanim zrobisz cokolwiek innego, lub b) spróbuj użyć go,
Response.Buffer = true
zanim zrobisz cokolwiek innego, aby upewnić się, że żadne dane wyjściowe nie są wysyłane do klienta, dopóki cała strona nie zostanie wykonana.źródło
Przekierowanie może się zdarzyć tylko wtedy, gdy pierwsza linia wiadomości HTTP to „
HTTP/1.x 3xx Redirect Reason
”.Jeśli już zadzwoniłeś
Response.Write()
lub ustawiłeś jakieś nagłówki, na przekierowanie będzie za późno. Możesz spróbować zadzwonićResponse.Headers.Clear()
przed przekierowaniem, aby sprawdzić, czy to pomoże.źródło
return RedirectToAction("Logout", "Authentication");
i otrzymuję ten błądPo prostu sprawdź, czy ustawiłeś opcję buforowania na false (domyślnie jest to prawda). Aby uzyskać odpowiedź. Przekierować do pracy,
źródło
Response.BufferOutput = true;
w akcji, w kontrolerze?Używanie
return RedirectPermanent(myUrl)
zadziałało dla mnieźródło
Możesz również użyć poniższego kodu
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
źródło
Jest na to jedna prosta odpowiedź: otrzymałeś coś innego, na przykład tekst lub cokolwiek związanego z wyjściem ze strony przed wysłaniem nagłówka. Ma to wpływ na to, dlaczego pojawia się ten błąd.
Po prostu sprawdź swój kod pod kątem możliwych wyników lub możesz umieścić nagłówek na górze metody, aby został wysłany jako pierwszy.
źródło
Jeśli próbujesz przekierować po wysłaniu nagłówków (jeśli na przykład robisz błąd przekierowania z częściowo wygenerowanej strony), możesz wysłać klientowi Javascript (location.replace lub location.href itp.) aby przekierować na dowolny adres URL. Oczywiście zależy to od tego, jaki HTML został już przesłany.
źródło
Mój problem został rozwiązany przez dodanie programu 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
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");}
źródło
Rozwiązałem problem przy użyciu: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); zamiast Response.Redirect.
źródło
Błąd Nie można przekierować po wysłaniu nagłówków HTTP.
System.Web.HttpException (0x80004005): nie można przekierować po wysłaniu nagłówków HTTP.
Sugestia
Jeśli używamy asp.net mvc i pracujemy na tym samym kontrolerze i przekierowujemy do innej akcji, nie ma potrzeby pisania ..
Response.Redirect ("ActionName", "ControllerName");
lepiej jest używać tylko
return RedirectToAction ("ActionName");
lub
return View („ViewName”);
źródło
Funkcja przekierowania prawdopodobnie działa przy użyciu „odświeżania” nagłówka http (i być może przy użyciu kodu 30X). Po wysłaniu nagłówków do klienta serwer nie może dołączyć polecenia przekierowania, ponieważ jest już za późno.
źródło
Jeśli pojawi się komunikat Nie można 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);
źródło
Upewnij się, że nie używasz
Response
metod s, takich jakResponse.Flush();
przed częścią przekierowującą.źródło
Istnieją 2 sposoby, aby to naprawić:
Po prostu dodaj
return
oświadczenie po swoimResponse.Redirect(someUrl);
(jeśli podpis metody nie jest "void", będziesz oczywiście musiał zwrócić ten "typ"), tak jak to:Response.Redirect ("Login.aspx");
powrót;
Zwróć uwagę, że powrót umożliwia serwerowi wykonanie przekierowania ... bez niego serwer chce kontynuować wykonywanie reszty kodu ...
Response.Redirect(someUrl)
OSTATNI wykonaną instrukcję w metodzie, która zgłasza wyjątek. Zastąp swójResponse.Redirect(someUrl)
ciąg VARIABLE o nazwie „someUrl” i ustaw go na lokalizację przekierowania ... w następujący sposób://......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ź Przekieruj do TUTAJ (koniec metody):
Response.Redirect(someUrl); return;
źródło
return
?return
Tylko określa, że metoda jest zakończona. Ale jeśli nie ma już żadnego kodu, metoda i tak jest zakończona. A przechowywanie adresu URL w zmiennej niczego nie zmienia, to znaczy: po co? Ciąg jest taki sam. Skompilowana rzecz nie robi żadnej różnicy między napisem a zmienną zawierającą łańcuch ...: pomyśl o tymx = 5
, więc x to 5, ale 5 to także 5. Nawet 10/2 to 5 ... też nie robi różnicy