Usuário com melhor resposta
Questão com Session.

Pergunta
-
Bom dia,
Estou com uma dúvida na Session.
Eu estou armazenando um valor de um objeto, no caso um ReportSource em uma Session, e depois utilizo em outra página.
Ex:
Página armazenamento:
Session.Contents.Add(Session.SessionID + "crReportSource", crReportSource);
Depois vou consumir em outro webform:
this.crReportSource = (CrystalReportSource)Session[Session.SessionID + "crReportSource"];Até ai tudo ótimo, está funcionando beleza!
O problema, ou seja, a dúvida, é que depois que utilizo o crReportSource, eu dou um DISPOSE() nele, e ao invés de ele limpar só o objeto, ele está removendo a Session também. Não deveria manter a Session?Veja o resultado:
Session[Session.SessionID + "crReportSource"]
1) Antes de dar dispose no objeto da página:
{CrystalDecisions.Web.CrystalReportSource}
base {System.Web.UI.Control}: {CrystalDecisions.Web.CrystalReportSource}
CacheDuration: 60
EnableCaching: true
ProjectPath: ""
Report: {CrystalDecisions.Web.Report}
ReportDocument: {CrystalDecisions.CrystalReports.Engine.ReportDocument}
base {System.Web.UI.Control}: {CrystalDecisions.Web.CrystalReportSource}
2) Depois de dar dispose no objeto da página:
Session[Session.SessionID + "crReportSource"]
{CrystalDecisions.Web.CrystalReportSource}
CacheDuration: '((CrystalDecisions.Web.CrystalReportSource)(Session[Session.SessionID + "crReportSource"])).CacheDuration' threw an exception of type 'System.NullReferenceException'
EnableCaching: '((CrystalDecisions.Web.CrystalReportSource)(Session[Session.SessionID + "crReportSource"])).EnableCaching' threw an exception of type 'System.NullReferenceException'
ProjectPath: ""
Report: {CrystalDecisions.Web.Report}
ReportDocument: '((CrystalDecisions.Web.CrystalReportSource)(Session[Session.SessionID + "crReportSource"])).ReportDocument' threw an exception of type 'System.NullReferenceException'
Obrigado à todos.
Respostas
-
Bom dia André,
Quando você guarda a referencia de uma classe em uma session e depois você da um dispose na classe automaticamente o objeto passado para session também é destruido.
Isto acontece porque as classes são do tipo referencia e não do tipo valor então elas são armazenadas no heap, ou seja, quando armazenamos o objeto de uma classe dentro de outras variaveis, session, cookies e etc. estamos passando uma referencia da classe no heap, e quando a destruimos todos os objetos que a usam também perderão esta referencia.
para você entender melhor segue um código abaixo:
using System; namespace sample1 { public class Pessoa { public string Nome { get; set; } public int Idade { get; set; } } class Program { static void Main(string[] args) { Pessoa pessoa = new Pessoa(); Pessoa homem = pessoa; homem.Nome = "Felipe"; homem.Idade = 21; Pessoa mulher = pessoa; mulher.Nome = "Tainá"; mulher.Idade = 20; Console.WriteLine("O nome do Homem é {0} e sua idade é {1}", homem.Nome, homem.Idade); Console.WriteLine("O nome da mulher é {0} e sua idade é {1}", mulher.Nome, mulher.Idade); string nome1, nome2; int idade1, idade2; nome1 = "Felipe"; idade1 = 21; nome2 = "Tainá"; idade2 = 20; Console.WriteLine("O nome do Homem é {0} e sua idade é {1}", nome1, idade1); Console.WriteLine("O nome da mulher é {0} e sua idade é {1}", nome2, idade2); Console.ReadKey(); //Saída: // O nome do Homem é Tainá e sua idade é 20 // O nome da mulher é Tainá e sua idade é 20 // // O nome do Homem é Felipe e sua idade é 21 // O nome da mulher é Tainá e sua idade é 20 } } }
Espero ter te ajudado.
Abraços
- Marcado como Resposta André R. Ruiz terça-feira, 13 de março de 2012 13:39
Todas as Respostas
-
Bom dia André,
Quando você guarda a referencia de uma classe em uma session e depois você da um dispose na classe automaticamente o objeto passado para session também é destruido.
Isto acontece porque as classes são do tipo referencia e não do tipo valor então elas são armazenadas no heap, ou seja, quando armazenamos o objeto de uma classe dentro de outras variaveis, session, cookies e etc. estamos passando uma referencia da classe no heap, e quando a destruimos todos os objetos que a usam também perderão esta referencia.
para você entender melhor segue um código abaixo:
using System; namespace sample1 { public class Pessoa { public string Nome { get; set; } public int Idade { get; set; } } class Program { static void Main(string[] args) { Pessoa pessoa = new Pessoa(); Pessoa homem = pessoa; homem.Nome = "Felipe"; homem.Idade = 21; Pessoa mulher = pessoa; mulher.Nome = "Tainá"; mulher.Idade = 20; Console.WriteLine("O nome do Homem é {0} e sua idade é {1}", homem.Nome, homem.Idade); Console.WriteLine("O nome da mulher é {0} e sua idade é {1}", mulher.Nome, mulher.Idade); string nome1, nome2; int idade1, idade2; nome1 = "Felipe"; idade1 = 21; nome2 = "Tainá"; idade2 = 20; Console.WriteLine("O nome do Homem é {0} e sua idade é {1}", nome1, idade1); Console.WriteLine("O nome da mulher é {0} e sua idade é {1}", nome2, idade2); Console.ReadKey(); //Saída: // O nome do Homem é Tainá e sua idade é 20 // O nome da mulher é Tainá e sua idade é 20 // // O nome do Homem é Felipe e sua idade é 21 // O nome da mulher é Tainá e sua idade é 20 } } }
Espero ter te ajudado.
Abraços
- Marcado como Resposta André R. Ruiz terça-feira, 13 de março de 2012 13:39
-