¿Por qué recibo & # 8220; No se puede redirigir después de que se hayan enviado encabezados HTTP & # 8221; cuando llamo Response.Redirect ()?

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

Pregunta

Cuando llamo a 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?

¿Fue útil?

Solución

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) usa Http " Location " encabezado de respuesta ( 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 enviado los encabezados de alguna otra manera, obtendrá la HttpException.

Una forma de evitar llamar a Response.Redirect () varias veces es verificar la propiedad Response.IsRequestBeingRedirected (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");

Otros consejos

Una vez que envía cualquier contenido al cliente, los encabezados HTTP ya se han enviado. Una llamada Response.Redirect () 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 mediante a) haciendo el redireccionamiento antes de hacer cualquier otra cosa, o b) intente usar Response.Buffer = true antes de hacer cualquier otra cosa, para asegurarse de que no haya salida se envía al cliente hasta que se completa la ejecución de toda la página.

Un redireccionamiento solo puede suceder si la primera línea de un mensaje HTTP es " HTTP / 1.x 3xx Motivo de redireccionamiento " ;.

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

Simplemente verifique si ha establecido la opción de almacenamiento en búfer en falso (de forma predeterminada es verdadero). Para response.redirect para trabajar,

  1. El almacenamiento en búfer debe ser cierto,
  2. no debería haber enviado más datos utilizando response.write, que excede el tamaño predeterminado del búfer (en cuyo caso se vaciará por sí solo y se enviarán los encabezados), por lo que no podrá redirigirlo.

Usando return RedirectPermanent (myUrl) funcionó para mí

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

Simplemente verifique su código para obtener una salida posible o puede colocar el encabezado encima de su método para que se envíe primero.

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

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 debajo del 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 redireccionamiento probablemente funciona usando el encabezado http 'actualizar' (y quizás también usando un código 30X). 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.

Si obtiene No se puede redirigir después de que se hayan enviado los encabezados HTTP, intente 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 su parte de redireccionamiento.

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();

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 enviar encabezados HTTP.

Sugerencia

Si usamos asp.net mvc y trabajamos en el mismo controlador y redirigimos a una Acción diferente, entonces no necesita escribir ..
Response.Redirect (" ActionName ", " ControllerName ");
es mejor usar solo
return RedirectToAction (" ActionName ");
o
return View (" ViewName ");

Hay 2 formas de arreglar esto:

  1. Simplemente agregue una declaración return después de su Response.Redirect (someUrl); (si la firma del método no es "nula", deberá devolver ese "tipo", por supuesto) así:

    Response.Redirect (" Login.aspx ");

    devolución ;

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 ...

  1. Convierta su Response.Redirect (someUrl) en 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 configúrela en la ubicación de redireccionamiento ... de la siguiente manera:

//......algunos códigos

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

// MOVE su respuesta. Redireccione AQUÍ (el final del método):

Response.Redirect(someUrl);
return; 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top