Pregunta

Espero que haya un experto de SharePoint aquí en SO que pueda ayudar con esto.

Aquí está el problema. Mis registros de SharePoint contienen esta línea, varias veces:

Un objeto SPRequest no se eliminó antes del final de este hilo. Para evitar el desperdicio de recursos del sistema, deseche este objeto o su elemento primario (como un SPSite o SPWeb) tan pronto como termine de usarlo. Este objeto ahora será eliminado. Id. De asignación: {8D090AD2-5D55-42C2-9873-2D5486FE257C} Para determinar dónde se asignó este objeto, cree una clave de registro en HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Shared Tools \ Web Server Extensions \ HeapSettings. Luego cree una nueva DWORD llamada SPRequestStackTrace con el valor 1 bajo esta clave.

Edité el registro y agregué la clave, pero no se encuentra el stacktrace en ninguna parte. No está en los registros de SharePoint ni en el Visor de eventos.

Realmente necesito encontrar la fuente de estas fugas SPSite / SPWeb y corregirlas, pero no puedo comenzar a editar el código que puede o no ser la fuente del problema. ¿Alguien tiene alguna sugerencia?

¿Fue útil?

Solución

Debe reiniciar los procesos afectados (si es w3wp.exe reinicie IIS) para detectar el cambio de registro.

Otros consejos

De lejos, la mejor ubicación para comprobar las advertencias de eliminación es:

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

En su caso, OpenWeb () deberá envolverse en un uso. Si lo está desechando en su bloque final, le sugiero que muestre más código para ver si está llamando a otro '' gotcha '' instancias. Además, no es necesario deshacerse de ciertos objetos SPSite y SPWeb si se obtienen de la clase SPContext.

Si desea realizar un seguimiento de las disposiciones del objeto, puede heredarlas y anular los métodos onload y ondispose para registrarlos de forma detallada.

Leer su código sugiere que el objeto SPWeb se declare fuera del delegado RunWithElevatedPriviledges. Esto puede tener un efecto en la forma en que SharePoint los elimina. En general, se sugiere hacer lo que necesita hacer con el objeto dentro del delegado.

Del http://msdn.microsoft.com/en-us /library/aa973248.aspx enlace que se mencionó anteriormente:

  

Llamar a Response.Redirect NO ejecutará el bloque finalmente . Por lo tanto,   Antes de que pueda ocurrir una redirección o transferencia de procesamiento, debe disponer   de los objetos.

Dado su código de ejemplo, aún podría estar generando objetos que no se eliminen porque la llamada Dispose () está en el bloque finalmente.

Mi sugerencia sería reconfigurar su código a lo siguiente:

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 tiene varias capas de declaraciones de uso, puede 'apilarlas' de esta manera y reducir la cantidad de sangría del código (similar a la forma en que un estado ejecuta la siguiente línea o bloque):

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top