Pergunta

Eu espero que haja um especialista em SharePoint aqui no SO que pode ajudar com isso.

Aqui está o problema. Meus logs SharePoint conter essa linha, várias vezes:

An SPRequest object was not disposed before the end of this thread. To avoid wasting system resources, dispose of this object or its parent (such as an SPSite or SPWeb) as soon as you are done using it. This object will now be disposed. Allocation Id: {8D090AD2-5D55-42C2-9873-2D5486FE257C} To determine where this object was allocated, create a registry key at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\HeapSettings. Then create a new DWORD named SPRequestStackTrace with the value 1 under this key.

Eu editei o registro e adicionado a chave, mas o stacktrace é longe de ser encontrada. Não é nos logs do SharePoint ou no Visualizador de eventos.

Eu realmente precisa encontrar a fonte desses vazamentos SPSite / SPWeb e corrigi-los, mas eu não pode simplesmente começar a editar o código que pode ou não ser a fonte do problema. Alguém tem alguma sugestão?

Foi útil?

Solução

Você precisa reiniciar os processos afetados (se for restart w3wp.exe IIS) para pegar a alteração do registro.

Outras dicas

De longe a melhor localização para verificar advertências relativas à eliminação é:

http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

No seu caso OpenWeb () terá de ser envolvido em um usando. Se você estiver descartando-lo em seu fianlly bloquear, então eu sugiro mostrando mais código para ver se você está chamando quaisquer outras instâncias "te peguei". Além disso, é desnecessário para dispor de certos SPSite e SPWeb objetos se eles são obtidos a partir da classe SPContext.

Se você deseja acompanhar alienação do objeto que você poderia herdar-los e substituir o onload e ondispose métodos para registrá-los em um detalhado mensagens caminho.

Leitura seu código sugere que o objeto SPWeb é declarada fora do delegado RunWithElevatedPriviledges. Isso pode ter um efeito sobre os descarta maneira SharePoint deles. É geralmente sugerido para fazer o que você precisa fazer para o objeto dentro do delegado.

A partir da http://msdn.microsoft.com/en-us /library/aa973248.aspx link que foi mencionado anteriormente:

Chamando Response.Redirect NÃO executar o bloco finally . Portanto, antes de qualquer redirecionamento ou transferência de processamento pode ocorrer, você deve descartar dos objetos.

Dado o seu código de exemplo, você ainda poderia estar gerando objetos que não são eliminados porque a chamada Dispose () está no último bloco.

A minha sugestão seria a de reconfigurar o código para o seguinte:

try 
{
    //instantiate the SPSite and SPWeb with elevated privileges:    
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    {
        using (SPSite mySite = new SPSite(url)) 
        {
            using (myWeb = mySite.OpenWeb()) 
            {
                //do stuff here
            }
        }
    });
}

Se você tem várias camadas de Usando declarações, você pode 'pilha' los como este e reduzir a quantidade do código é recuado (semelhante à maneira como um caso statment executa a próxima linha ou bloco):

try 
{
    //instantiate the SPSite and SPWeb with elevated privileges:    
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    {
        using (SPSite mySite = new SPSite(url)) 
        using (myWeb = mySite.OpenWeb()) 
        {
            //do stuff here
        }
    });
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top