none
[RESOLVIDO] Como resolver: Não é possível redirecionar após os cabeçalhos HTTP terem sido enviados RRS feed

  • Pergunta

  • Olá amigos, 

    Estou com um probleminha na minha aplicação. Faz um tempinho que isso está acontecendo, não está atrapalhando o funcionamento, mas fica gerando erro desnecessário.

    Tenho um página que gera arquivo de texto com dados vindo de um SQL Server. Até aí beleza. Crio o arquivo com todas as informações corretamente. E então faço o Download do arquivo. Todo esse processo não é realizado na página, é realizado numa classe que criei para realizar essa função.

    Quando o arquivo é criado e aparece a janela para baixar, aparece a seguinte mensagem: Não é possível redirecionar após os cabeçalhos HTTP terem sido enviados, quando eu faço o debug.

    Consigo baixar o arquivo normalmente e utilizá-lo, porém esse erro não deveria acontecer.

    Alguém sabe me informar como corrijo isso?

    Se precisarem de código fonte eu posto aqui.


    Obrigado!

    Cleverson Darsie




    • Editado Marcos SJ segunda-feira, 15 de fevereiro de 2016 16:39 Edição de título
    • Editado Cleverson Darsie quarta-feira, 14 de setembro de 2016 19:55
    sexta-feira, 12 de fevereiro de 2016 14:24

Respostas

  • Cleverson,

    Pelo trecho de código informado (se estiver na mesma página onde está fazendo o download), foi o que eu comentei, ou seja, após o download a página dá o erro.

    Tente isolar o código do Response que força o download em outra página e crie um link para essa página.

    Ex.: pagina.aspx (onde terá o link para clicar e baixar), download.aspx (página que vai forçar o download).

    Não sei se o res2 tem algum campo que possa servir de parâmetro para a página que irá forçar o download, visto que tem apenas parte do código.

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 13:47
    sexta-feira, 12 de fevereiro de 2016 16:43
  • Obrigado Renildo! Vou ler sobre esse assunto.


    Atenção, para quem ainda tem o problema, eu resolvi colocando um finally depois do catch. Dentro do finally eu coloquei o Response.End().

    Nunca mais deu exception.


    Cleverson Darsie


    segunda-feira, 15 de fevereiro de 2016 21:44

Todas as Respostas

  • Cleverson,

    Se puder, coloca o código da página onde tem a opção de download, creio que irá facilitar na orientação da solução do problema.

    Em todo caso (imagino), código do download, apesar de está em uma classe, está sendo "forçado" na mesma página, onde tem o botão/link de download, logo a página tem seu ciclo de vida finalizado quando clica no botão para baixar.

    Pode ser esse o problema.

    Se tiver mais informações, só postar.

    • Marcado como Resposta Cleverson Darsie sexta-feira, 12 de fevereiro de 2016 15:05
    • Não Marcado como Resposta Cleverson Darsie sexta-feira, 12 de fevereiro de 2016 15:06
    sexta-feira, 12 de fevereiro de 2016 14:43
  • Certo Renildo, 

    Segue abaixo o trecho do código do Download:


    Trecho após a criação do arquivo, verifica se o arquivo foi criado e faz o download.
    if (File.Exists(pag.Server.MapPath(res2)))
                {
                    HttpResponse response = HttpContext.Current.Response;
                    response.ClearContent();
                    response.Clear();
    
                    pag.Response.ContentType = "text-plain";
                    pag.Response.AddHeader("Content-Disposition", "attachment;filename=" + tr.AIS);
                    pag.Response.TransmitFile(res2);
                    response.Flush();
                    response.End();
                }
                else
                {
                    tr.CodRetorno = 1;
                    tr.Retorno = "Não há arquivo de integração para o registro de liberação informado.";
                }

    Após isso, volta para a página que chamou a classe geradora do arquivo e cai no Catch do meu bloco Try.


    Obrigado.

    Cleverson Darsie

    sexta-feira, 12 de fevereiro de 2016 15:09
  • Cleverson,

    Pelo trecho de código informado (se estiver na mesma página onde está fazendo o download), foi o que eu comentei, ou seja, após o download a página dá o erro.

    Tente isolar o código do Response que força o download em outra página e crie um link para essa página.

    Ex.: pagina.aspx (onde terá o link para clicar e baixar), download.aspx (página que vai forçar o download).

    Não sei se o res2 tem algum campo que possa servir de parâmetro para a página que irá forçar o download, visto que tem apenas parte do código.

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 13:47
    sexta-feira, 12 de fevereiro de 2016 16:43
  • Renildo, 

    É o seguinte.. Isso só acontece quando estou debugando o código. Publiquei a aplicação num servidor de testes e deixei implementado um LOG em caso de CATCH, gravo num arquivo texto se der um erro.

    Quando estou em modo debug, após o download cai no Catch da página que chama a classe que gera o arquivo para download. Como se algo tivesse dado errado.

    Quando executei a mesma aplicação, só que no server, o log não foi gravado. Nenhuma informação foi gravada no arquivo. Ou seja, não caiu no Catch...

    O que percebi também foi o seguinte. Após eu comentar o trecho do código que tem um Response.Redirect, o erro não aconteceu mais no modo debug.

    Abaixo o trecho do código do Catch que ocorre o erro:
    catch (Exception ex)
                {
                    string res = Server.MapPath("~/Logs/LogWLAB.txt");
                    Encoding encode = Encoding.GetEncoding("ISO-8859-1");
    
                    string logExcept = DateTime.Now + " | " + ex.Message + " | " + Session["TRId"] + " | " +
                        Request.UserHostAddress + " | " + Session["CartaoLis"] + " | " + Session["Retorno_Login_CodigoCliente"];
    
                    using (FileStream fs = File.Create(res))
                    {
                        using (StreamWriter sw = new StreamWriter(fs, encode))
                        {
                            sw.WriteLine(logExcept);
                        }
                    }
                    //Response.Redirect("excerro.aspx", false); //Aqui ocorre o erro após o Download
                }


    Cleverson Darsie

    sexta-feira, 12 de fevereiro de 2016 17:22
  • Cleverson,

    No código que você passou de exemplo tem o trecho: 

    ...
    response.End(); // aqui que encerra o ciclo de vida da página, se tentar fazer outro download vai dar erro, porque vai está na mesma página.

    Então o que sugeri, foi isolar essa parte de código em uma outra página e chamá-la através de um link.

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 13:47
    • Não Marcado como Resposta Cleverson Darsie terça-feira, 12 de julho de 2016 11:15
    sexta-feira, 12 de fevereiro de 2016 17:55
  • Entendi o que você quis dizer Renildo.

    Eu passo para a classe que gera o arquivo a página por parâmetro:

    switch (tr.Layout)
                            {
                                case "L-100": ais.L100(tr, this.Page); //Aqui passo a página
                                    break;
                            }


    Ai eu recebo  a página como parâmetro:

    public void L506(TRS tr, Page pag) //Aqui recebo
            {
               // Código aqui
            }

    E por fim eu encerro depois do download:

                  {
                    pag.Response.TransmitFile(res2);
                    pag.Response.Flush();
                    pag.Response.End(); //Aqui encerro
                  }
    Por isso que quando volta pra página que iniciou tudo e eu insiro um trecho de código com Response, aparece essa Exception, a vida útil da página já acabou ali, então mesmo que ocorra algum Catch que eu precise enviar para uma página de exceção, como era o meu caso, nada aconteceria.


    Agora entendi tudo. Preciso dar um jeito de tratar a exceção do Catch caso algo de errado aconteça, pois agora só grava no LOG, mas não faz nada... Graças a Deus nunca deu erro, por isso que nunca percebi isso antes.


    Obrigado pela ajuda Renildo.

    Sabe se tem alguma outra forma de enviar para um Redirect depois do Response.End()?


    Cleverson Darsie

    sexta-feira, 12 de fevereiro de 2016 18:37
  • Cleverson,

    Desculpa a Demora.

    Já até vi algo sobre, como o exemplo do link abaixo,

    Correct use of System.Web.HttpResponse.Redirect

    Mas confesso que não testei.


    segunda-feira, 15 de fevereiro de 2016 19:32
  • Obrigado Renildo! Vou ler sobre esse assunto.


    Atenção, para quem ainda tem o problema, eu resolvi colocando um finally depois do catch. Dentro do finally eu coloquei o Response.End().

    Nunca mais deu exception.


    Cleverson Darsie


    segunda-feira, 15 de fevereiro de 2016 21:44