Por que entro “Não é possível redirecionar depois de cabeçalhos HTTP foram enviadas” quando eu chamar Response.Redirect ()?

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

Pergunta

Quando eu chamo Response.Redirect(someUrl) eu recebo um HttpException:. "Não é possível redirecionar depois de cabeçalhos HTTP foram enviadas"

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

Foi útil?

Solução

De acordo com a documentação do MSDN para Response.Redirect(string url), ele lançará um HttpException quando "um redirecionamento é tentada após os cabeçalhos HTTP foram enviadas". Desde Response.Redirect(string url) usa o "Location" cabeçalho de resposta HTTP ( http://en.wikipedia.org/wiki/ HTTP_headers Nº de Respostas ), chamando-fará com que os cabeçalhos para serem enviados para o cliente. Isto significa que se você chamá-lo uma segunda vez, ou se você chamá-lo depois de ter causado os cabeçalhos para serem enviados de alguma outra forma, você terá a HttpException.

Uma maneira de se proteger contra chamar Response.Redirect () várias vezes é verificar a propriedade Response.IsRequestBeingRedirected (bool) antes de chamá-lo.

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

Outras dicas

Uma vez que você enviar qualquer conteúdo em tudo para o cliente, os cabeçalhos HTTP já foram enviados. Uma chamada Response.Redirect() funciona enviando informação especial nos cabeçalhos que fazem o navegador pedir uma URL diferente.

Uma vez que os cabeçalhos já foram enviados, asp.net não pode fazer o que quiser (modificar os cabeçalhos)

Você pode obter em torno deste, a) quer fazer o redirecionamento antes de fazer qualquer outra coisa, ou b) tentar usar Response.Buffer = true antes de fazer qualquer outra coisa, ter certeza de que nenhuma saída é enviada para o cliente até que toda a página é feita execução.

A Redirect só pode acontecer se a primeira linha em uma mensagem HTTP é "HTTP/1.x 3xx Redirect Reason".

Se você já chamado Response.Write() ou definir alguns cabeçalhos, vai ser tarde demais para um redirecionamento. Você pode tentar chamar Response.Headers.Clear() antes do redirecionamento para ver se isso ajuda.

Basta verificar se você tiver definido a opção de armazenamento, a falsa (por padrão, seu verdadeiro). Para response.redirect ao trabalho,

  1. Buffer deve ser verdade,
  2. você não deveria ter enviado mais dados usando response.write que excede o tamanho do buffer padrão (caso em que ele irá liberar-se fazendo com que os cabeçalhos para serem enviados), portanto, não permitindo que você redirecione.

Usando return RedirectPermanent(myUrl) trabalhou para mim

Não há uma resposta simples para isso: Você tem sido a saída outra coisa, como texto, ou qualquer coisa relacionada a saída de sua página antes de enviar o cabeçalho. Isso afeta porque você obter esse erro.

Basta verificar o seu código para a saída posible ou você pode colocar o cabeçalho no topo de seu método para que ele será enviado em primeiro lugar.

Se você está tentando redirecionar após os cabeçalhos foram enviados (se, por exemplo, você está fazendo um redirecionamento de erro a partir de uma página parcialmente gerado), você pode enviar algum cliente Javascript (location.replace ou location.href, etc.) para redirecionar para qualquer URL que você quer. Claro, isso depende do que HTML já foi enviado.

Meu problema foi resolvido adicionando o manipulador de exceções ao punho "Não é possível redirecionar depois de cabeçalhos HTTP foram enviadas". Este erro, como mostrado abaixo 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");}

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

A função de redirecionamento provavelmente funciona usando a 'atualização' http header (e talvez usando um código de 30X também). Uma vez que os cabeçalhos foram enviados para o cliente, não há caminho para o servidor para anexar o comando de redirecionamento, é tarde demais.

Se você receber não pode redirecionar depois de cabeçalhos HTTP foram enviadas, em seguida, tentar este código abaixo.

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

Certifique-se que você não usar métodos Responses como Response.Flush(); antes de sua parte redirecionamento.

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

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();

Erro não pode redirecionar depois de cabeçalhos HTTP terem sido enviados.

System.Web.HttpException (0x80004005):. Não é possível redirecionar depois de cabeçalhos HTTP foram enviados

Sugestão
Se usarmos asp.net MVC e trabalhando em mesmo controlador e redirecionamento para ação diferente, então você não precisa escrever ..
Response.Redirect ( "ActionName", "controllername"); < br> o seu melhor para usar somente
RedirectToAction retorno ( "ActionName");
ou
retornar View ( "ViewName");

Existem 2 maneiras de corrigir isto:

  1. Basta adicionar uma declaração return após a sua Response.Redirect(someUrl); (Se a assinatura do método não é "vazio", você terá que voltar que "tipo", é claro) assim:

    Response.Redirect ( "Login.aspx");

    retorno;

Observe o retorno permite que o servidor para executar o redirecionamento ... sem ela, o servidor quer continuar a executar o resto do seu código ...

  1. Faça o seu Response.Redirect(someUrl) a declaração executado por último no método que está jogando a exceção. Substitua seu Response.Redirect(someUrl) com uma variável de cadeia chamado "someUrl", e configurá-lo 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 de código

// mover seu Response.Redirect para AQUI (o fim do método):

Response.Redirect(someUrl);
return; 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top