Quando chiamo Response.Redirect(someUrl)
ottengo la seguente HttpException:
Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate.
Perché ottengo questo? E come posso risolvere questo problema?
Quando chiamo Response.Redirect(someUrl)
ottengo la seguente HttpException:
Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate.
Perché ottengo questo? E come posso risolvere questo problema?
Risposte:
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.IsRequestBeingRedirected
proprietà (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");
endResponse
) impostato su true."
Response.IsRequestBeingRedirected
è falso e ricevo ancora la stessa eccezione (all'interno del Application_EndRequest
metodo dell'evento in Global.asax). Non riesco a capire perché.
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 = true
prima di fare qualsiasi altra cosa, per assicurarti che nessun output venga inviato al client fino a quando l'intera pagina non è stata eseguita.
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.
return RedirectToAction("Logout", "Authentication");
e ottengo
Controlla solo se hai impostato l'opzione di buffering su false (per impostazione predefinita è true). Affinché response.redirect to work,
Response.BufferOutput = true;
nell'azione, nel controller?
È inoltre possibile utilizzare il codice indicato di seguito
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
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.
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.
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");}
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");
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);
Ci sono 2 modi per risolvere questo problema:
Basta aggiungere una return
dichiarazione 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 ...
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;
return
? L' return
unico 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