Usuário com melhor resposta
HttpContext, Session ou Querystring

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