none
Questão com Session. RRS feed

  • 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:

    1) Antes de dar dispose no objeto da página:

    Session[Session.SessionID + "crReportSource"]
    {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}


    2) Depois de dar dispose no objeto da página:

    Session[Session.SessionID + "crReportSource"]
    {CrystalDecisions.Web.CrystalReportSource}

        base {System.Web.UI.Control}: {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.

    terça-feira, 13 de março de 2012 11:44

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
    terça-feira, 13 de março de 2012 13:26

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
    terça-feira, 13 de março de 2012 13:26
  • Ajudou bastante.
    Essa era minha dúvida, imaginei que fosse isso, que ele estivesse guardando por referência.


    Obrigado.

    terça-feira, 13 de março de 2012 13:39