Cuando llamo Response.Redirect(someUrl)
, obtengo la siguiente HttpException:
No se puede redireccionar después de que se hayan enviado los encabezados HTTP.
¿Por qué obtengo esto? ¿Y cómo puedo solucionar este problema?
fuente
Cuando llamo Response.Redirect(someUrl)
, obtengo la siguiente HttpException:
No se puede redireccionar después de que se hayan enviado los encabezados HTTP.
¿Por qué obtengo esto? ¿Y cómo puedo solucionar este problema?
De acuerdo con la documentación de MSDN Response.Redirect(string url)
, lanzará 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 ), 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 hecho que los encabezados se envíen de alguna otra manera, obtendrá la HttpException.
Una forma de evitar llamar a Response.Redirect () varias veces es comprobar la Response.IsRequestBeingRedirected
propiedad (bool) antes de llamarla.
// 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
) establecido en verdadero".Response.IsRequestBeingRedirected
es falso y sigo recibiendo esta misma excepción (Application_EndRequest
método de evento interno en Global.asax). No puedo entender por qué.Una vez que envíe cualquier contenido al cliente, los encabezados HTTP ya se enviaron. Una
Response.Redirect()
llamada funciona enviando información especial en los encabezados que hacen que el navegador solicite una URL diferente.Dado que los encabezados ya se enviaron, asp.net no puede hacer lo que desea (modificar los encabezados)
Puede evitar esto a) haciendo el redireccionamiento antes de hacer cualquier otra cosa, ob) intente usarlo
Response.Buffer = true
antes de hacer cualquier otra cosa, para asegurarse de que no se envíe ningún resultado al cliente hasta que toda la página haya terminado de ejecutarse.fuente
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ó
Response.Write()
o estableció algunos encabezados, será demasiado tarde para una redirección. Puede intentar llamarResponse.Headers.Clear()
antes de la redirección para ver si eso ayuda.fuente
return RedirectToAction("Logout", "Authentication");
y me sale ese errorSimplemente verifique si ha establecido la opción de almacenamiento en búfer en falso (por defecto es verdadero). Para que response.redirect funcione,
fuente
Response.BufferOutput = true;
en la acción, en el controlador?El uso
return RedirectPermanent(myUrl)
funcionó para mífuente
También puede usar el código mencionado a continuación
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
fuente
Hay una respuesta simple para esto: ha generado algo más, como texto, o cualquier cosa relacionada con la salida de su página antes de enviar su encabezado. Esto afecta la razón por la que obtiene ese error.
Simplemente verifique su código para una posible salida o puede colocar el encabezado en la parte superior de su método para que se envíe primero.
fuente
Si está intentando redirigir después de que se hayan enviado los encabezados (si, por ejemplo, está haciendo una redirección de error desde una página generada parcialmente), puede enviar algún cliente Javascript (location.replace o location.href, etc.) para redirigir a la URL que desee. Por supuesto, eso depende de qué HTML ya se haya enviado.
fuente
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");}
fuente
Resolví el problema usando: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); en lugar de Response.Redirect.
fuente
Error No se puede redireccionar después de que se hayan enviado los encabezados HTTP.
System.Web.HttpException (0x80004005): no se puede redireccionar después de que se hayan enviado los encabezados HTTP.
Sugerencia
Si usamos asp.net mvc y trabajamos en el mismo controlador y redirigimos a una acción diferente, no es necesario que escriba ..
Response.Redirect ("ActionName", "ControllerName");
es mejor usar solo
return RedirectToAction ("ActionName");
o
devolver View ("ViewName");
fuente
La función de redireccionamiento probablemente funcione usando el encabezado http 'actualizar' (y tal vez usando un código 30X también). Una vez que los encabezados se han enviado al cliente, no hay forma de que el servidor agregue ese comando de redireccionamiento, es demasiado tarde.
fuente
Si obtiene No se puede redireccionar después de que se hayan enviado los encabezados HTTP, intente con el siguiente código.
HttpContext.Current.Server.ClearError(); // Response.Headers.Clear(); HttpContext.Current.Response.Redirect("/Home/Login",false);
fuente
Asegúrese de no utilizar
Response
los métodos de s comoResponse.Flush();
antes de la parte de redireccionamiento.fuente
Hay dos formas de solucionar este problema:
Simplemente agregue una
return
declaración después de suResponse.Redirect(someUrl);
(si la firma del método no es "nula", tendrá que devolver ese "tipo", por supuesto) así:Response.Redirect ("Login.aspx");
regreso;
Tenga en cuenta que la devolución permite que el servidor realice la redirección ... sin ella, el servidor quiere continuar ejecutando el resto de su código ...
Response.Redirect(someUrl)
ÚLTIMA instrucción ejecutada en el método que está lanzando la excepción. Reemplace suResponse.Redirect(someUrl)
con una cadena VARIABLE llamada "someUrl", y configúrela en la ubicación de redireccionamiento ... 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
// MUEVA su Response.Redirect a AQUÍ (el final del método):
Response.Redirect(someUrl); return;
fuente
return
? Elreturn
único define que el método está completo. Pero cuando no queda ningún código, el método se completa de todos modos. Y almacenar una URL en una variable no cambia nada, quiero decir: ¿por qué debería hacerlo? La cuerda es la misma. Lo compilado no hace ninguna diferencia entre una cadena y una variable que contiene una cadena ...: piensex = 5
, entonces x es 5 pero 5 también es 5. incluso 10/2 sería 5 ... tampoco hay diferencia