Perché ricevo "Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate" quando chiamo Response.Redirect ()?

StackOverflow https://stackoverflow.com/questions/159523

Domanda

Quando chiamo Response.Redirect (someUrl) ricevo un'HttpException: " Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate " ;.

Perché ottengo questo? E come posso risolvere questo problema?

È stato utile?

Soluzione

Secondo la documentazione MSDN per Response.Redirect (string url) , verrà generata un'HttpException quando viene tentato un reindirizzamento dopo che le intestazioni HTTP sono state inviate " ;. Poiché Response.Redirect (string url) utilizza l'Http " Location " header di risposta ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ) , chiamandolo, le intestazioni verranno inviate al client. Ciò significa che se lo chiami una seconda volta o se lo chiami dopo aver fatto in modo che le intestazioni vengano inviate in qualche altro modo, otterrai HttpException.

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

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

Altri suggerimenti

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

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

Puoi aggirare il problema a) eseguendo il reindirizzamento prima di fare qualsiasi altra cosa oppure b) prova a utilizzare Response.Buffer = true prima di fare qualsiasi altra cosa, per assicurarti che nessun output viene inviato al client fino al completamento dell'esecuzione dell'intera pagina.

Un reindirizzamento può verificarsi solo se la prima riga di un messaggio HTTP è " HTTP / 1.x 3xx Motivo di reindirizzamento " ;.

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

Controlla se l'opzione buffering è stata impostata su false (per impostazione predefinita è true). Perché response.redirect funzioni,

  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à automaticamente causando l'invio delle intestazioni), pertanto non ti sarà consentito il reindirizzamento.

Utilizzo return RedirectPermanent (myUrl) ha funzionato per me

C'è una semplice risposta per questo: È stato emesso qualcos'altro, ad esempio testo, o qualsiasi cosa correlata all'output dalla tua pagina prima di inviare l'intestazione. Questo influenza il motivo per cui si ottiene quell'errore.

Controlla 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 eseguendo un reindirizzamento degli errori da una pagina parzialmente generata), puoi inviare alcuni Javascript client (location.replace o location.href, ecc.) per reindirizzare all'URL desiderato. Naturalmente, ciò dipende da quale HTML è già stato inviato.

Il mio problema è stato risolto aggiungendo il Gestore eccezioni da gestire " Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate " ;. questo errore come mostrato sotto il 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");}

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

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

Se ricevi Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate, prova questo codice qui sotto.

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

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

Puoi anche usare il codice sotto indicato

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

Errore Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate.

System.Web.HttpException (0x80004005): impossibile reindirizzare dopo l'invio delle intestazioni HTTP.

Suggerimento
Se utilizziamo asp.net mvc e lavoriamo sullo stesso controller e reindirizziamo a azioni diverse, non è necessario scrivere ..
Response.Redirect (" ActionName ", " ControllerName "); È meglio usare solo
return RedirectToAction (" ActionName ");
o
return View (" ViewName ");

Esistono 2 modi per risolvere questo problema:

  1. Aggiungi semplicemente un'istruzione return dopo Response.Redirect (someUrl); (se la firma del metodo non è "nulla", dovrai restituire quel "tipo", ovviamente) come così:

    Response.Redirect (" Login.aspx ");

    di 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 VARIABLE denominata " someUrl " ;, e impostala nella posizione di reindirizzamento ... come segue:

//......some codice

string someUrl = String.Empty

..... un po 'di logica

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

...... altro codice

// SPOSTA la tua Response.Redirect su HERE (la fine del metodo):

Response.Redirect(someUrl);
return; 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top