Правильная утилизация объектов SharePoint? - PullRequest
2 голосов
/ 20 октября 2008

Я надеюсь, что здесь есть эксперт SharePoint по SO, который может помочь с этим.

Вот проблема. Мои журналы SharePoint содержат эту строку несколько раз:

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.

Я отредактировал реестр и добавил ключ, но трассировки стека нигде нет. Его нет ни в журналах SharePoint, ни в Event Viewer.

Мне действительно нужно найти источник этих утечек SPSite / SPWeb и исправить их, но я не могу просто начать редактировать код, который может или не может быть источником проблемы. У кого-нибудь есть предложения?

Ответы [ 4 ]

2 голосов
/ 20 октября 2008

На сегодняшний день лучшее место для проверки предостережений при утилизации:

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

В вашем случае OpenWeb () необходимо будет обернуть в использование. Если вы размещаете его в своем блоке fianlly, я бы посоветовал показать больше кода, чтобы увидеть, вызываете ли вы какие-либо другие экземпляры "gotcha". Кроме того, нет необходимости удалять определенные объекты SPSite и SPWeb, если они получены из класса SPContext.

Если вы хотите отслеживать удаление объекта, вы можете унаследовать его и переопределить методы onload и ondispose для регистрации их в виде подробного сообщения.

Чтение вашего кода предполагает, что объект SPWeb объявлен вне делегата RunWithElevatedPriviledges. Это может повлиять на то, как SharePoint избавляется от них. Обычно предлагается сделать то, что вам нужно сделать с объектом внутри делегата.

1 голос
/ 22 октября 2008

Вам нужно перезапустить затронутые процессы (если это w3wp.exe, перезапустить IIS), чтобы поймать изменение реестра.

1 голос
/ 20 октября 2008

Из ссылки http://msdn.microsoft.com/en-us/library/aa973248.aspx, которая упоминалась ранее:

Вызов Response.Redirect НЕ будет выполнять блок finally . Следовательно, прежде чем произойдет какое-либо перенаправление или передача обработки, вы должны объектов.

Учитывая ваш пример кода, вы все еще можете генерировать объекты, которые не удаляются, потому что вызов Dispose () находится в блоке finally.

Мое предложение было бы изменить конфигурацию вашего кода следующим образом:

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

Если у вас есть несколько уровней операторов Using, вы можете «сложить» их следующим образом и уменьшить объем кода, с отступом (аналогично тому, как if выполняет следующую строку или блок):

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
        }
    });
}
0 голосов
/ 20 октября 2008

Предлагаю вам прочитать:

Если ни один из этих советов не работает. Взгляните на Устранение неисправностей утечек SPSite / SPWeb в WSS v3 и MOSS 2007 .

Редактировать : Вы должны утилизировать объект SPSite. Так как он автоматически удалит все его объекты SPWeb .

...