none
Problemas ao utilizar Dispose e Close em objetos SharePoint. Será que fiz errado? RRS feed

  • Pergunta

  • Olá,
    Eu tenho uma web part que possui um único método.
    Este método apenas insere um item em uma lista.

    Para isso utilizo os objetos SPSite e SPWeb conforme parte de código abaixo:

    using (SPSite site = SPContext.Current.Site)
          {
          using (SPWeb web = site.OpenWeb())
                {
                     //Código que insere itens na lista

                    web.Dispose();
                    web.Close();
                 }
          site.Dispose();
          site.Close();
         }


    Quando rodo a web part no meu site, logo depois que aperto o botão que chama o método acima, me é mostrado a seguinte mensagem de erro:

    Erro
    Tentando usar um objeto SPWeb que foi fechado ou descartado e não é mais válido. 

    Será que fiz algo errado no código?
    A mensagem de erro é exibida, mas mesmo assim o código funciona inserindo normalmente o item na lista.


    O correto é utilizar o dispose e close nos objetos, certo?
    Então por que do erro?

    Obrigado

    k2rto4-Pb - Analista SharePoint




    • Editado TI DEV quinta-feira, 31 de maio de 2012 01:42
    quinta-feira, 31 de maio de 2012 01:40

Respostas

  • Ola K2rto4-Pb

    Ao utilizares "using" a framework automaticamente realiza o dispose, por isso nao consegue fazer dispose 2 vezes. 

    String SiteUrl=SPContext.Current.Site.url;

    using (SPSite site = new SPSite(SiteUrl))
          {
          using (SPWeb web = site.OpenWeb())
                {
                     //Código que insere itens na lista

                 }
         }

    Tem aqui um manual com as boas praticas:
    "Best Practices: Using Disposable Windows SharePoint Services Objects"

    http://msdn.microsoft.com/en-us/library/aa973248(v=office.12)


    André Lage Microsoft SharePoint, CRM Consultant
    Blog:http://aaclage.blogspot.com
    Codeplex:http://spupload.codeplex.com/http://simplecamlsearch.codeplex.com/

    quinta-feira, 31 de maio de 2012 07:00
    Moderador
  • Olá,

    Você está fazendo Dispose utilizando o using no objeto SPSite, que foi criado internamente pelo Object Model do SharePoint.

    Além disso, você está fazendo using no SPWeb e logo em seguida fazendo o Dispose nele.

    Segue abaixo como deveria ser:

    SPSite site = SPContext.Current.Site;
    using(SPWeb web = site.OpenWeb())
    {
    //Código que insere itens na lista
    }

    OU SIMPLESMENTE

    SPSite site = SPContext.Current.Site;
    SPWeb web = SPContext.Current.Web;

    Obs.: Recomendo a utilização do SPDisposeCheck: http://archive.msdn.microsoft.com/SPDisposeCheck

    abs


    Andre Vicente Assad Gil
    MCTS: Windows SharePoint Services 3.0: Application Development
    MCTS: .Net Framework 2.0: Web Applications

    Resolveu? Então marque como resposta!
    Solved? So, mark topic as resolved!


    quinta-feira, 31 de maio de 2012 02:28

Todas as Respostas

  • Olá,

    Você está fazendo Dispose utilizando o using no objeto SPSite, que foi criado internamente pelo Object Model do SharePoint.

    Além disso, você está fazendo using no SPWeb e logo em seguida fazendo o Dispose nele.

    Segue abaixo como deveria ser:

    SPSite site = SPContext.Current.Site;
    using(SPWeb web = site.OpenWeb())
    {
    //Código que insere itens na lista
    }

    OU SIMPLESMENTE

    SPSite site = SPContext.Current.Site;
    SPWeb web = SPContext.Current.Web;

    Obs.: Recomendo a utilização do SPDisposeCheck: http://archive.msdn.microsoft.com/SPDisposeCheck

    abs


    Andre Vicente Assad Gil
    MCTS: Windows SharePoint Services 3.0: Application Development
    MCTS: .Net Framework 2.0: Web Applications

    Resolveu? Então marque como resposta!
    Solved? So, mark topic as resolved!


    quinta-feira, 31 de maio de 2012 02:28
  • Olá André,

    Mas não é preciso utilizar o Dispose e o Close como uma boa prática de desenvolvimento?

    E mesmo utilizando o código da forma como eu fiz o mesmo insere os dados na lista.

    Obrigado.


    k2rto4-Pb - Analista SharePoint

    quinta-feira, 31 de maio de 2012 02:37
  • Ola K2rto4-Pb

    Ao utilizares "using" a framework automaticamente realiza o dispose, por isso nao consegue fazer dispose 2 vezes. 

    String SiteUrl=SPContext.Current.Site.url;

    using (SPSite site = new SPSite(SiteUrl))
          {
          using (SPWeb web = site.OpenWeb())
                {
                     //Código que insere itens na lista

                 }
         }

    Tem aqui um manual com as boas praticas:
    "Best Practices: Using Disposable Windows SharePoint Services Objects"

    http://msdn.microsoft.com/en-us/library/aa973248(v=office.12)


    André Lage Microsoft SharePoint, CRM Consultant
    Blog:http://aaclage.blogspot.com
    Codeplex:http://spupload.codeplex.com/http://simplecamlsearch.codeplex.com/

    quinta-feira, 31 de maio de 2012 07:00
    Moderador
  • Bom dia André Lage,

    Entendi o uso do Dispose.

    Quanto ao Close() o seu uso esta correto?

    Obrigado


    k2rto4-Pb - Analista SharePoint

    quinta-feira, 31 de maio de 2012 13:11