Por que recebo “Não é possível redirect após os headers HTTP terem sido enviados” quando eu chamo Response.Redirect ()?

Quando eu chamo Response.Redirect(someUrl) eu recebo um HttpException: “Não é possível redirect após headers HTTP foram enviados”.

Por que eu recebo isso? E como posso corrigir esse problema?

    Acordo com a MSDN documentação para Response.Redirect(string url) , ele irá lançar um HttpException quando “um redirecionamento é tentado após os headers HTTP foram enviados”. Como Response.Redirect(string url) usa o header de resposta “Location” do Http ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), chamá-lo fará com que os headers sejam enviados para o cliente. Isso significa que, se você ligar pela segunda vez, ou se você ligar depois de ter feito com que os headers sejam enviados de alguma outra forma, você receberá o HttpException.

    Uma maneira de evitar a chamada de Response.Redirect () várias vezes é verificar a propriedade Response.IsRequestBeingRedirected (bool) antes de chamá-la.

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

    Depois de enviar qualquer conteúdo para o cliente, os headers HTTP já foram enviados. Uma chamada Response.Redirect() funciona enviando informações especiais nos headers que fazem o navegador solicitar uma URL diferente.

    Como os headers já foram enviados, o asp.net não pode fazer o que você quer (modifique os headers)

    Você pode contornar isso fazendo a) Redirecionar antes de fazer qualquer outra coisa, ou b) tentar usar Response.Buffer = true antes de fazer qualquer outra coisa, para garantir que nenhuma saída seja enviada ao cliente até que toda a página seja feito em execução.

    Um redirecionamento só pode acontecer se a primeira linha em uma mensagem HTTP for ” HTTP/1.x 3xx Redirect Reason “.

    Se você já chamou Response.Write() ou define alguns headers, será muito tarde para um redirecionamento. Você pode tentar chamar Response.Headers.Clear() antes do Redirect para ver se isso ajuda.

    Apenas verifique se você configurou a opção de buffer para false (por padrão, true). Para response.redirect ao trabalho,

    1. Buffering deve ser verdade
    2. você não deve ter enviado mais dados usando o response.write, que excede o tamanho do buffer padrão (caso em que ele será liberado, fazendo com que os headers sejam enviados) e, portanto, impedindo o redirecionamento.

    Usando o return RedirectPermanent(myUrl) funcionou para mim

    Há uma resposta simples para isso: você já produziu algo diferente, como texto ou qualquer coisa relacionada à saída da sua página antes de enviar o header. Isso afeta porque você consegue esse erro.

    Basta verificar o seu código para saída possível ou você pode colocar o header em cima do seu método para que ele seja enviado primeiro.

    Meu problema foi resolvido adicionando o Manipulador de exceções para manipular “Não é possível redirect após os headers HTTP terem sido enviados”. este erro como mostrado abaixo

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

    Eu resolvi o problema usando: Response.RedirectToRoute (“CultureEnabled”, RouteData.Values); em vez de Response.Redirect.

    A function de redirecionamento provavelmente funciona usando o header http ‘refresh’ (e talvez usando um código 30X também). Depois que os headers forem enviados ao cliente, não há como o servidor append esse comando de redirecionamento, é tarde demais.

    Se você está tentando redirect após os headers terem sido enviados (se, por exemplo, você estiver fazendo um erro de redirecionamento de uma página parcialmente gerada), você pode enviar algum JavaScript cliente (location.replace ou location.href, etc.) para redirect para qualquer URL que você deseja. Claro, isso depende de qual HTML já foi enviado para baixo.

    Se você receber Não é possível redirect após os headers HTTP terem sido enviados, tente este código abaixo.

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

    Certifique-se de que você não usa methods Response s ‘como Response.Flush(); antes de redirect sua parte.

    Você também pode usar o código abaixo mencionado

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

    Erro Não é possível redirect após os headers HTTP terem sido enviados.

    System.Web.HttpException (0 x 80004005): Não é possível redirect após os headers HTTP terem sido enviados.

    Sugestão

    Se usarmos asp.net mvc e trabalhando no mesmo controlador e redirect para ação diferente, então você não precisa escrever ..
    Response.Redirect (“ActionName”, “ControllerName”);
    é melhor usar apenas
    return RedirectToAction (“ActionName”);
    ou
    return View (“ViewName”);

    Existem duas maneiras de corrigir isso:

    1. Basta adicionar uma instrução de return após seu Response.Redirect(someUrl); (se a assinatura do método não for “void”, você terá que retornar esse “tipo”, é claro) da seguinte forma:

      Response.Redirect (“Login.aspx”);

      Retorna;

    Observe que o retorno permite que o servidor execute o redirecionamento … sem ele, o servidor deseja continuar executando o resto do seu código …

    1. Faça seu Response.Redirect(someUrl) a instrução LAST executada no método que está lançando a exceção. Substitua seu Response.Redirect(someUrl) por uma cadeia VARIABLE denominada “someUrl” e configure-a para o local de redirecionamento … como segue:

    //......some code

     string someUrl = String.Empty 

    ….. alguma lógica

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

    …… mais código

    // Mova sua Response.Redirect para AQUI (o final do método):

     Response.Redirect(someUrl); return;