Pregunta ¿Por qué aparece "No se puede redireccionar después de que se han enviado encabezados HTTP" cuando llamo a Response.Redirect ()?


Cuando llamo Response.Redirect(someUrl) Obtengo una HttpException: "No se puede redirigir después de que se hayan enviado los encabezados HTTP".

¿Por qué obtengo esto? ¿Y cómo puedo solucionar este problema?


76
2017-10-01 20:22


origen


Respuestas:


De acuerdo con la documentación de MSDN para Response.Redirect(string url), lanzará una HttpException cuando "se intente una redirección después de que se hayan enviado los encabezados HTTP". Ya que Response.Redirect(string url) utiliza el encabezado de respuesta Http "Ubicación" (http://en.wikipedia.org/wiki/HTTP_headers#Responses), llamarlo hará que los encabezados se envíen al cliente. Esto significa que si lo llama por segunda vez, o si lo llama después de haber causado que los encabezados se envíen de alguna otra manera, obtendrá la HttpException.

Una forma de evitar llamar a Response.Redirect () varias veces es verificar el Response.IsRequestBeingRedirected propiedad (bool) antes de llamarlo.

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

112
2017-10-01 20:25



Una vez que envíe cualquier contenido al cliente, los encabezados HTTP ya han sido enviados. UN Response.Redirect() Llamar funciona enviando información especial en los encabezados que hacen que el navegador solicite una URL diferente.

Como los encabezados ya fueron enviados, asp.net no puede hacer lo que usted desea (modifique los encabezados)

Puede solucionar esto haciendo lo siguiente: a) haciendo el redireccionamiento antes de hacer cualquier otra cosa, o b) intente usando Response.Buffer = true antes de hacer cualquier otra cosa, para asegurarse de que no se envíe ninguna salida al cliente hasta que la página completa se haya ejecutado.


16
2017-10-01 20:27



Una redirección solo puede suceder si la primera línea de un mensaje HTTP es "HTTP/1.x 3xx Redirect Reason".

Si ya llamaste Response.Write() o establecer algunos encabezados, será demasiado tarde para una redirección. Puedes intentar llamar Response.Headers.Clear() antes de redirigir para ver si eso ayuda.


7
2017-10-01 20:24



Simplemente verifique si ha configurado la opción de almacenamiento en búfer en falso (por defecto es verdadero). Para responder. Directo al trabajo,

  1. El almacenamiento en búfer debe ser cierto,
  2. no debería haber enviado más datos utilizando response.write que exceda el tamaño del búfer predeterminado (en cuyo caso se vaciará causando el envío de los encabezados), lo que le impedirá redirigir.

3
2018-05-01 09:27



Utilizando return RedirectPermanent(myUrl) trabajó para mi


2
2018-03-23 08:45



Hay una respuesta simple para esto: Se le ha generado algo más, como texto, o cualquier cosa relacionada con el resultado de su página antes de enviar su encabezado. Esto afecta por qué obtienes ese error.

Simplemente verifique su código para obtener posibles resultados o puede poner el encabezado sobre su método para que se envíe primero.


1
2018-01-14 03:07



Mi problema se resolvió agregando el controlador de excepciones para manejar "No se puede redirigir después de que se hayan enviado los encabezados HTTP". este error como se muestra a continuación código

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
2018-01-08 12:02