2008-10-01 10 views

Odpowiedz

103

Zgodnie z dokumentacją MSDN dla Response.Redirect(string url), wygeneruje wyjątek HttpException, gdy "przekierowanie zostanie wykonane 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 po wywołaniu go po wywołaniu nagłówków w inny sposób, otrzymasz wyjątek HttpException.

Jednym ze sposobów ochrony przed wywołaniem Response.Redirect() wiele razy jest sprawdzenie właściwości Response.IsRequestBeingRedirected (bool) przed wywołaniem go.

// 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"); 
+1

Dokładnie tak. Zdarza się to dość łatwo z ASP.NET MVC 4 i filtrami wyjątków itp. Nie można także zmienić kodu statusu odpowiedzi HTTP po wydaniu przekierowania 301/302. – Jaans

+0

Rozwiązałem problem, sprawiając, że wszystkie właściwości na mojej stronie "statyczne" – Sal

+3

sprawiają, że twoje właściwości statyczne są niebezpiecznym rozwiązaniem. – prospector

7

Przekierowanie może się zdarzyć tylko wtedy, gdy pierwszy wiersz w komunikacie HTTP to "HTTP/1.x 3xx Redirect Reason".

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

16

Po wysłaniu żadnych treści w ogóle do klienta, nagłówki HTTP już zostały wysłane. Wywołanie Response.Redirect() działa poprzez wysłanie specjalnych informacji w nagłówkach, które sprawiają, że przeglądarka wymaga innego adresu URL.

Ponieważ nagłówki zostały już wysłane, asp.net nie może robić, co chcesz (modyfikować nagłówki)

Można obejść ten problem poprzez: a) albo wykonywania przekierowania, zanim zrobisz cokolwiek innego, albo b) spróbuj użyć 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.

0

Funkcja przekierowania prawdopodobnie działa przy użyciu nagłówka http "odświeżania" (i może również przy użyciu kodu 30X). Po wysłaniu nagłówków do klienta nie ma możliwości, aby serwer dołączył polecenie przekierowania, jest za późno.

3

Sprawdź, czy ustawiłeś opcję buforowania na false (domyślnie jest to prawda). Dla response.redirect do pracy,

  1. Buforowanie powinny być prawdziwe,
  2. nie należy Wysłano więcej danych przy użyciu Response.Write która przekracza domyślny rozmiar bufora (w tym przypadku będzie wylewać się powodując nagłówki wysłane), co uniemożliwia przekierowanie.
1

Jest jedna prosta odpowiedź: Otrzymałeś coś innego, jak tekst, lub cokolwiek związanego z wyjściem z twojej strony przed wysłaniem nagłówka. To wpływa na błąd.

Po prostu sprawdź kod na obecność wyjścia lub umieść nagłówek na górze metody, aby był wysyłany jako pierwszy.

0

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ć klienta JavaScript (location.replace lub location.href itp.), aby przekierować do dowolnego adresu URL, który chcesz. Oczywiście zależy to od tego, jaki HTML został już wysłany.

1

Moja sprawa została rozwiązana 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:

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");} 
0

Jeśli pojawi się komunikat Nie można przekierować po wysłaniu nagłówków HTTP, spróbuj tego poniżej.

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

I rozwiązać ten problem za pomocą: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); zamiast Response.Redirect.

2

Korzystanie return RedirectPermanent(myUrl) pracował dla mnie

0

Pamiętaj, że przed swoim części przekierowującego nie używać Response metod S'jak Response.Flush();.

0

Można również skorzystać z poniższego wspomniano kod

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

Istnieją 2 sposoby, aby to naprawić:

  1. Wystarczy dodać return oświadczenie Po Response.Redirect(someUrl); (jeśli podpis metoda nie jest " void ", będziesz musiał oczywiście zwrócić ten" typ ") jako tak:

    Response.Redirect (" Logi n.aspx ");

    return;

Uwaga powrót pozwala serwerowi wykonywać przekierowanie ... bez niej, serwer chce kontynuować wykonywanie resztę kodu ...

  1. Spraw, aby Twój Response.Redirect(someUrl) wykonał OSTATNĄ instrukcję w metodzie, która rzuca wyjątek. Wymień Response.Redirect(someUrl) ze zmienną string o nazwie "someUrl" i ustaw go do lokalizacji przekierowania ... następująco:

//......some code

string someUrl = String.Empty 

..... niektóre logika

...... więcej kodu

// PRZENIEŚ twoją odpowiedź.Następna do TUTAJ (koniec metody):

Response.Redirect(someUrl); 
return; 
Powiązane problemy