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

Cuando llamo a Response.Redirect(someUrl) obtengo una HttpException: “No se puede redirigir después de que se han enviado los encabezados HTTP”.

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

De acuerdo con la documentación de MSDN para Response.Redirect(string url) , arrojará una HttpException cuando “se intente una redirección después de que se hayan enviado los encabezados HTTP”. Dado que Response.Redirect(string url) utiliza el encabezado de respuesta Http “Location” ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), al llamarlo se enviarán los encabezados 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 protegerse de llamar a Response.Redirect () varias veces es verificar la propiedad Response.IsRequestBeingRedirected (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"); 

Una vez que envíe cualquier contenido al cliente, los encabezados HTTP ya han sido enviados. Una llamada Response.Redirect() 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 solucionarlo haciendo lo siguiente: a) haciendo el redireccionamiento antes de hacer cualquier otra cosa, o b) intente utilizar Response.Buffer = true antes de hacer cualquier otra cosa, para asegurarse de que no se envíe ninguna salida al cliente hasta que toda la página esté hecho de ejecución.

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

Si ya llamó a Response.Write() o configura algunos encabezados, será demasiado tarde para una redirección. Puede intentar llamar a Response.Headers.Clear() antes de la redirección para ver si eso ayuda.

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.

Usar return RedirectPermanent(myUrl) funcionó para mí

Hay una respuesta simple para esto: le han enviado 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.

Mi problema se resolvió agregando el controlador de excepciones para manejar “No se puede redireccionar 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");} 

Resolví el problema usando: Response.RedirectToRoute (“CultureEnabled”, RouteData.Values); en lugar de Response.Redirect.

La función de redirección probablemente funciona al usar el encabezado http ‘refresh’ (y tal vez usar un código 30X también). Una vez que los encabezados han sido enviados al cliente, no hay forma de que el servidor anexe ese comando de redireccionamiento, es demasiado tarde.

Si intenta redireccionar después de que se han enviado los encabezados (si, por ejemplo, está redirigiendo un error desde una página generada parcialmente), puede enviar JavaScript a algún cliente (location.replace o location.href, etc.) para redirigir a la URL que quieras. Por supuesto, eso depende de qué HTML ya se haya enviado.

Si obtiene No se puede redirigir después de que se hayan enviado los encabezados HTTP, pruebe con este código a continuación.

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

Asegúrese de no utilizar los métodos de Response s ‘como Response.Flush(); antes de tu parte de redireccionamiento

También puede usar el código mencionado a continuación

 Response.Write("");Response.Flush(); 

Error No se puede redirigir después de que se hayan enviado los encabezados HTTP.

System.Web.HttpException (0x80004005): no se puede redirigir después de que se hayan enviado los encabezados HTTP.

Sugerencia

Si utilizamos asp.net mvc y trabajamos en el mismo controlador y redirigimos a diferentes acciones, entonces no necesita escribir …
Response.Redirect (“ActionName”, “ControllerName”);
es mejor usarlo solo
devolver RedirectToAction (“Nombre de la acción”);
o
return View (“ViewName”);

Hay 2 formas de solucionar esto:

  1. Simplemente agregue una statement de return después de su Response.Redirect(someUrl); (Si la firma del método no es “nula”, deberá devolver ese “tipo”, por supuesto) de la siguiente manera:

    Response.Redirect (“Login.aspx”);

    regreso;

Tenga en cuenta que la devolución permite al servidor realizar la redirección … sin ella, el servidor desea continuar ejecutando el rest de su código …

  1. Realice su Response.Redirect(someUrl) la ÚLTIMA instrucción ejecutada en el método que arroja la excepción. Reemplace su Response.Redirect(someUrl) con una cadena VARIABLE llamada “someUrl”, y establézcala en la ubicación de redirección … de la siguiente manera:

//......some code

 string someUrl = String.Empty 

….. algo de lógica

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

…… más código

// MUEVE su Response.Redirect a AQUÍ (el final del método):

 Response.Redirect(someUrl); return;