Perché ricevo il messaggio "Impossibile reindirizzare dopo l'invio delle intestazioni HTTP" quando chiamo Response.Redirect ()?


Risposte:


121

Secondo la documentazione di MSDN per Response.Redirect(string url), verrà generata una HttpException quando "viene tentato un reindirizzamento dopo l'invio delle intestazioni HTTP". Poiché Response.Redirect(string url)utilizza l'intestazione della risposta "Location" Http ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), chiamarla causerà l'invio delle intestazioni al client. Ciò significa che se lo chiami una seconda volta o se lo chiami dopo aver causato l'invio delle intestazioni in un altro modo, otterrai l'HttpException.

Un modo per evitare di chiamare Response.Redirect () più volte è controllare la Response.IsRequestBeingRedirectedproprietà (bool) prima di chiamarla.

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

2
Proprio così. Ciò accade abbastanza facilmente con ASP.NET MVC 4 e i filtri di eccezione, ecc. Inoltre, non è possibile modificare il codice di stato della risposta HTTP dopo che è stato emesso un reindirizzamento 301/302.
Jaans

Ho risolto il problema rendendo 'statiche' tutte le proprietà sulla mia pagina
Sal

4
rendere statiche le tue proprietà è una soluzione pericolosa
prospector

Come può il reindirizzamento essere chiamato una seconda volta a meno che non venga rilevata ThreadAbortException (dalla prima volta)? :} "Chiamare Redirect equivale a chiamare Redirect con il secondo parametro ( endResponse) impostato su true."
user2864740

1
È strano, ma in un'applicazione webform legacy Response.IsRequestBeingRedirectedè falso e ricevo ancora la stessa eccezione (all'interno del Application_EndRequestmetodo dell'evento in Global.asax). Non riesco a capire perché.
Alisson

17

Dopo aver inviato qualsiasi contenuto al client, le intestazioni HTTP sono già state inviate. Una Response.Redirect()chiamata funziona inviando informazioni speciali nelle intestazioni che fanno sì che il browser richieda un URL diverso.

Poiché le intestazioni sono già state inviate, asp.net non può fare quello che vuoi (modificare le intestazioni)

Puoi aggirare questo problema a) facendo il Reindirizzamento prima di fare qualsiasi altra cosa, oppure b) prova a usare Response.Buffer = trueprima di fare qualsiasi altra cosa, per assicurarti che nessun output venga inviato al client fino a quando l'intera pagina non è stata eseguita.


Per me non funziona. Uso .NET, MVC e ho una chiamata all'interno del metodo del controller. Continuo a ricevere l'eccezione, sebbene avvenga il reindirizzamento.
FrenkyB

8

Un reindirizzamento può avvenire solo se la prima riga di un messaggio HTTP è " HTTP/1.x 3xx Redirect Reason".

Se hai già chiamato Response.Write()o impostato alcune intestazioni, sarà troppo tardi per un reindirizzamento. Puoi provare a chiamare Response.Headers.Clear()prima del reindirizzamento per vedere se questo aiuta.


Uso return RedirectToAction("Logout", "Authentication");e ottengo
quell'errore

Quando ho provato a cancellare le intestazioni, ho ottenuto System.PlatformNotSupportedException: questa operazione richiede la modalità pipeline integrata di IIS.
IrishChieftain

3

Controlla solo se hai impostato l'opzione di buffering su false (per impostazione predefinita è true). Affinché response.redirect to work,

  1. Il buffering dovrebbe essere vero,
  2. non avresti dovuto inviare più dati utilizzando response.write che supera la dimensione del buffer predefinita (nel qual caso si scaricherà da solo causando l'invio delle intestazioni), impedendo quindi il reindirizzamento.

1
Response.BufferOutput = true;nell'azione, nel controller?
Kiquenet

2

L'utilizzo ha return RedirectPermanent(myUrl)funzionato per me


Ho azione e controller
Kiquenet

2

È inoltre possibile utilizzare il codice indicato di seguito

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

1

C'è una semplice risposta per questo: hai ricevuto qualcos'altro, come il testo, o qualsiasi cosa relativa all'output dalla tua pagina prima di inviare l'intestazione. Ciò influisce sul motivo per cui viene visualizzato l'errore.

Controlla semplicemente il tuo codice per l'output possibile o puoi mettere l'intestazione sopra il tuo metodo in modo che venga inviato per primo.


1

Se stai tentando di reindirizzare dopo che le intestazioni sono state inviate (se, ad esempio, stai facendo un errore di reindirizzamento da una pagina parzialmente generata), puoi inviare un client Javascript (location.replace o location.href, ecc.) per reindirizzare a qualsiasi URL tu voglia. Naturalmente, questo dipende da quale HTML è già stato inviato.


1

Il mio problema è stato risolto aggiungendo il gestore delle eccezioni per gestire "Impossibile reindirizzare dopo l'invio delle intestazioni HTTP". questo errore come mostrato di seguito codice

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

Ho risolto il problema utilizzando: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); invece di Response.Redirect.


1

Errore Impossibile reindirizzare dopo l'invio delle intestazioni HTTP.

System.Web.HttpException (0x80004005): impossibile reindirizzare dopo che sono state inviate le intestazioni HTTP.

Suggerimento

Se utilizziamo asp.net mvc e lavoriamo sullo stesso controller e reindirizziamo a un'azione diversa, non è necessario scrivere ..
Response.Redirect ("ActionName", "ControllerName");
è meglio usare solo
return RedirectToAction ("ActionName");
o
restituire View ("ViewName");


Uso ActionName da un altro ControllerName?
Kiquenet

0

La funzione di reindirizzamento probabilmente funziona utilizzando l'intestazione http "aggiorna" (e forse anche un codice 30X). Una volta che le intestazioni sono state inviate al client, non c'è modo per il server di aggiungere quel comando di reindirizzamento, è troppo tardi.


0

Se ottieni Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate, prova questo codice di seguito.

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

0

Assicurati di non utilizzare Responsei metodi di s come Response.Flush();prima della parte di reindirizzamento.


-3

Ci sono 2 modi per risolvere questo problema:

  1. Basta aggiungere una returndichiarazione dopo il tuoResponse.Redirect(someUrl); (se la firma del metodo non è "void", dovrai restituire quel "tipo", ovviamente) in questo modo:

    Response.Redirect ("Login.aspx");

    ritorno;

Nota che il ritorno consente al server di eseguire il reindirizzamento ... senza di esso, il server vuole continuare a eseguire il resto del codice ...

  1. Rendi Response.Redirect(someUrl)l'ultima istruzione eseguita nel metodo che genera l'eccezione. Sostituisci il tuo Response.Redirect(someUrl)con una stringa VARIABILE denominata "someUrl" e impostalo sulla posizione di reindirizzamento ... come segue:

//......some code

string someUrl = String.Empty

..... un po 'di logica

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

...... altro codice

// MOVE your Response.Redirect to HERE (the end of the method):

Response.Redirect(someUrl);
return; 

scusa ma questo non ha alcun senso per me. Cosa dovrebbe fare (in un metodo di restituzione del vuoto) quel ridondante return? L' returnunico definisce che il metodo è completato. Ma quando non è rimasto alcun codice, il metodo è comunque completato. E memorizzare un URL in una variabile non cambia nulla, voglio dire: perché dovrebbe? La stringa è la stessa. La cosa compilata non fa alcuna differenza tra una stringa e una variabile contenente una stringa ...: pensa x = 5, quindi x è 5 ma anche 5 è 5. anche 10/2 sarebbe 5 ... non fa differenza neanche
Matthias Burger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.