none
HttpContext, Session ou Querystring RRS feed

  • Pergunta

  • Sou iniciante em asp.net e desenvolvi uma aplicação que passa valores de uma página pra outra por session. Ja li que devemos ser cautelosos quanto ao uso de session, mas gostaria de saber qual a melhor forma para eu usar na minha aplicação.

    na minha aplicação eu faço uma consulta de um BD e transformo os campos em sessions:

                    Session["Insc_CartaoInsc"] = dr["CartaoInsc"].ToString();
                    Session["Insc_Situacao"] = dr["Situacao"].ToString();
                    Session["Insc_NumInsc"] = dr["Inscricao"].ToString();

                    Session["Insc_Predio"] = dr["Predio"].ToString();
                    Session["Insc_Sala"] = dr["Sala"].ToString();
                    Session["Insc_EnderecoPredio"] = dr["EnderecoPredio"].ToString();
                    Session["Insc_DataProva"] = dr["DataProva"].ToString();
                    Session["Insc_Turno"] = dr["Turno"].ToString();
                    Session["Insc_Horario"] = dr["Horario"].ToString();

                    Session["Ini_Cargo"] = dr["Cargo"].ToString();
                    Session["Ini_ValorInscricao"] = dr["ValorInsc"].ToString();
                    Session["idInscricao"] = dr["Inscricao"].ToString();

                    Session["RG"] = dr["RG"].ToString();
                    Session["CPF"] = dr["CPF"].ToString();
                    Session["Nome"] = dr["Candidato"].ToString();
                    Session["Endereco"] = dr["Endereco"].ToString() + ", " + dr["Numero"].ToString();
                    Session["Bairro"] = dr["Bairro"].ToString();
                    Session["Cidade"] = dr["Cidade"].ToString();
                    Session["CEP"] = dr["CEP"].ToString();
                    Session["UF"] = dr["UF"].ToString();
                    Session["DataNasc"] = dr["DataNasc"].ToString();

    Levo essas variáveis pra outras páginas da aplicação, como página de boleto, Cartão de inscrição.. etc.

    Pra quem ja leu que devemos ter cuidado com o uso de sessions, eu percebo que estou abusando bem delas... ou esse quantitativo acima usado é aceitável?

    Bom.. verdade é que a aplicação tem dado problemas de "Object reference not set to an instance of an object" Referindo-se justamente a Sessions que por algum motivo não existem mais. (Não é Timeout). Já pra prevenir isso, coloquei o ContDown(Visivel au usuário) para avisar que a sessão expirou/está expirando e redirecionar o usuário para a página inicial.

    Alguma luz quanto a isso?

    É o exageiro nas sessions que tem deixado o servidor (Locaweb) confuso (Levando em consideração que esse sistema tem picos altos de acesso)

    Agradeço a gentileza.

    Abel André


    • Editado hksistemas segunda-feira, 6 de fevereiro de 2012 22:26 erro de digitação
    segunda-feira, 6 de fevereiro de 2012 22:24

Respostas

  • Criar tanta variável de sessão assim é d+. Se quer trabalhar com session faça algo assim:

    Imagine o seguinte:
    public class Venda
    {
        public int Codigo { get; set; }
        public string Produto { get; set; }
        public decimal Valor { get; set; }
        public DateTime DataVenda { get; set; }
    
        public static Venda GetDadosVenda()
        {
            //carrega o objeto
            return new Venda();
        }
    }

    No momento de recuperar jogue o objeto na session:
    Venda dadosVenda = Venda.GetDadosVenda();
    Session["DadosVenda"] = dadosVenda;

    Na outra página você valida se a session não é nula e recupera o objeto:

    if (Session["DadosVenda"] != null)
    {
        Venda dadosVenda = (Venda)Session["DadosVenda"];
        int codigo = dadosVenda.Codigo;
        string produto = dadosVenda.Produto;
        decimal valor = dadosVenda.Valor;
        //etc
    }

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.


    • Editado Paulo César Viana terça-feira, 7 de fevereiro de 2012 01:22
    • Marcado como Resposta hksistemas terça-feira, 7 de fevereiro de 2012 23:10
    terça-feira, 7 de fevereiro de 2012 01:22
  • Na verdade é porque você deve ter criado a classe Venda na mesmo página. Experimenta criar uma Classe separada para ser usada na sua aplicação como um todo.

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta hksistemas terça-feira, 7 de fevereiro de 2012 23:10
    terça-feira, 7 de fevereiro de 2012 20:43

Todas as Respostas

  • Criar tanta variável de sessão assim é d+. Se quer trabalhar com session faça algo assim:

    Imagine o seguinte:
    public class Venda
    {
        public int Codigo { get; set; }
        public string Produto { get; set; }
        public decimal Valor { get; set; }
        public DateTime DataVenda { get; set; }
    
        public static Venda GetDadosVenda()
        {
            //carrega o objeto
            return new Venda();
        }
    }

    No momento de recuperar jogue o objeto na session:
    Venda dadosVenda = Venda.GetDadosVenda();
    Session["DadosVenda"] = dadosVenda;

    Na outra página você valida se a session não é nula e recupera o objeto:

    if (Session["DadosVenda"] != null)
    {
        Venda dadosVenda = (Venda)Session["DadosVenda"];
        int codigo = dadosVenda.Codigo;
        string produto = dadosVenda.Produto;
        decimal valor = dadosVenda.Valor;
        //etc
    }

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.


    • Editado Paulo César Viana terça-feira, 7 de fevereiro de 2012 01:22
    • Marcado como Resposta hksistemas terça-feira, 7 de fevereiro de 2012 23:10
    terça-feira, 7 de fevereiro de 2012 01:22
  • Eu manteria na sessão apenas elementos "chaves" (ids, nomes, etc) e quando quisesse acessar outros dados, acessaria o banco no momento necessário, e não empilharia todos estes registros na sessão....
    terça-feira, 7 de fevereiro de 2012 12:59
  • Paulo, boa tarde!

    Obrigado pela resposta. Achei interessante a solução proposta por você. Eu venho do Pascal (Delphi) e como falei acima, sou iniciante em c# e .Net. Encontrei uma dificuldade na sua proposta acima netsa parte:

    Na outra página você valida se a session não é nula e recupera o objeto:
    if (Session["DadosVenda"] != null)
    {
        Venda dadosVenda = (Venda)Session["DadosVenda"];
        int codigo = dadosVenda.Codigo;
        string produto = dadosVenda.Produto;
        decimal valor = dadosVenda.Valor;
        //etc
    }

    Meu problema é: Não consigo "enxergar" Venda na outra página para criar:  Venda dadosVenda = (Venda)Session["DadosVenda"];
    A não ser que eu crie (Falo como leigo que sou) algo que eu enxergar em todo projeto, como "References" por exemplo.

    terça-feira, 7 de fevereiro de 2012 20:38
  • Na verdade é porque você deve ter criado a classe Venda na mesmo página. Experimenta criar uma Classe separada para ser usada na sua aplicação como um todo.

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta hksistemas terça-feira, 7 de fevereiro de 2012 23:10
    terça-feira, 7 de fevereiro de 2012 20:43
  • Olá marcelo!

    Grato por sua colaboração. O problema é que essa aplicação necessita acessar constantemente registro do BD.

    É um sistema para cadastro em concurso.

    I- Um concurso é selecionado pelo candidato na página inicial. Ja começo a usar session desde ai para usar posteriormente.

    II- O Candidato Seleciona o cargo para o concurso escolhido na página inicial (Gravo em session as caracteristicas do cargo selecionado[Valor da inscrição, Id do concurso que aquele carpo está vinculado, Nome do cargo.])

    III- Candidato se cadastra com os seus dados cadastrais: Nome de pai, mae, idade etc.

    IIII- Cadastro da inscrição concluida, Levo todas as sessions que venho juntando no decorrer do processo e uso pra imprimir o boleto.

    Algumas dessas sessions é produto de retorno de consulta (Id do concurso, Nome do concurso, Id do cargo, Nome do cargo Valor da inscrição), outras são produto de digitação do cadastro do usuário. [Nome, endereço, nascimento etc]

    Por isso acho q estou abusando das session e pedi orientação quanto a.

    O Paulo Cesar enxugou 99,9% das sessions que eu usava conforme meu post inicial, e colocou tudo em uma única session.

    Pergunta: Essa session com tanta informação não seria considerada Carregada de mais? Claro que é uma solução, percebi, incoparavelmente melhor que a que eu uso no momento.

    terça-feira, 7 de fevereiro de 2012 21:01
  • Eu não considero isto um "abuso" de session.

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    terça-feira, 7 de fevereiro de 2012 21:08
  • Boa noite, Paulo!

    Fiz como sua sugestão/exemplo  acima.

    Como eu ja tinha criado uma dll onde ja tinha todas funções e classes criadas para cadastro e edição de dados, bem como outras funções, proveitei e adidionei mais esta funcionalidade à ela e tudo está funcionando perfeito!

    Valeu mesmo pela dica!!


    • Editado hksistemas terça-feira, 7 de fevereiro de 2012 23:18
    terça-feira, 7 de fevereiro de 2012 23:16