asp.net - ¿Por qué aparece "No se puede redireccionar después de que se han enviado encabezados HTTP" cuando llamo a Response.Redirect()?
http-headers httpexception (14)
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?
Asegúrese de no utilizar los métodos de Response
s ''como Response.Flush();
antes de tu parte de redireccionamiento
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..com");
if (!Response.IsRequestBeingRedirected)
// Will not be called
Response.Redirect("http://www.google.com");
Hay 2 formas de solucionar esto:
Simplemente agregue una declaración de
return
después de suResponse.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 resto de su código ...
- Realice su
Response.Redirect(someUrl)
la ÚLTIMA instrucción ejecutada en el método que arroja la excepción. Reemplace suResponse.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;
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.
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.
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.
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);
Simplemente verifique si ha configurado la opción de almacenamiento en búfer en falso (por defecto es verdadero). Para responder. Directo al trabajo,
- El almacenamiento en búfer debe ser cierto,
- 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.
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();
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.
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.
Usar return RedirectPermanent(myUrl)
funcionó para mí