Question

J'espère qu'il y a un expert SharePoint sur SO qui peut vous aider.

Voici le problème. Mes journaux SharePoint contiennent cette ligne à plusieurs reprises:

Un objet SPRequest n'a pas été supprimé avant la fin de ce thread. Pour éviter de gaspiller des ressources système, supprimez cet objet ou son parent (tel qu'un SPSite ou un SPWeb) dès que vous avez fini de l'utiliser. Cet objet sera maintenant éliminé. ID d'allocation: {8D090AD2-5D55-42C2-9873-2D5486FE257C} Pour déterminer où cet objet a été alloué, créez une clé de registre dans HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Outils partagés \ Extensions serveur Web \ HeapSettings. Créez ensuite un nouveau DWORD nommé SPRequestStackTrace avec la valeur 1 sous cette clé.

J'ai édité le registre et ajouté la clé, mais le stacktrace est introuvable. Ce n'est pas dans les journaux SharePoint ni dans l'observateur d'événements.

Je dois vraiment trouver la source de ces fuites SPSite / SPWeb et les corriger, mais je ne peux pas simplement commencer à éditer du code qui peut être ou ne pas être la source du problème. Quelqu'un a-t-il des suggestions?

Était-ce utile?

La solution

Vous devez redémarrer les processus affectés (s'il s'agit de W3wp.exe, redémarrer IIS) pour intercepter le changement de registre.

Autres conseils

De loin, le meilleur endroit pour vérifier les restrictions liées à l'élimination est:

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

Dans votre cas, OpenWeb () devra être encapsulé dans un using. Si vous le supprimez dans votre bloc final, nous vous suggérons de montrer plus de code pour voir si vous appelez un autre " gotcha " les instances. De même, il n'est pas nécessaire de disposer de certains objets SPSite et SPWeb s'ils sont obtenus à partir de la classe SPContext.

Si vous souhaitez suivre les aliénations de l'objet, vous pouvez en hériter et redéfinir les méthodes onload et ondispose pour les consigner de manière bavarde.

La lecture de votre code suggère que l’objet SPWeb est déclaré en dehors du délégué RunWithElevatedPriviledges. Cela peut avoir un effet sur la façon dont SharePoint les élimine. Il est généralement suggéré de faire ce que vous devez faire à l’objet à l’intérieur du délégué.

Extrait du http://msdn.microsoft.com/en-us /library/aa973248.aspx lien précédemment mentionné:

  

L'appel de Response.Redirect N'EXÉCUTERA PAS le bloc finally . Donc,   avant toute réorientation ou transfert de traitement, vous devez disposer   des objets.

Etant donné votre exemple de code, vous pouvez toujours générer des objets qui ne sont pas éliminés, car l'appel Dispose () est dans le bloc finally.

Ma suggestion serait de reconfigurer votre code comme suit:

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
            }
        }
    });
}

Si vous avez plusieurs couches d'instructions Using, vous pouvez les "empiler" comme ceci et réduire la quantité de code indenté (de la même manière que si une instruction exécute la ligne ou le bloc suivant):

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
        }
    });
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top