Вопрос

Я использовал что -то вроде

 using (SPWeb web = SPControl.GetContextWeb(Context))

Но при развертывании проекта он показывает ошибку. Пытаясь выяснить причину, которую я наткнулся на статью MSDN:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spcontrol.getContextWeb.aspx

который гласит это:

Не используйте метод распоряжения или закрытия класса SPWEB, чтобы закрыть объект, возвращаемый с помощью метода GetContextWeb. Вместо этого пусть Windows SharePoint Services или ваше портальное приложение управляют объектом.

Я новичок в SharePoint, может ли кто -нибудь объяснить мне причину этого?

Это было полезно?

Решение

Если вы получите SPWEB от контекста, он был создан в другом месте, и что в другом месте разрушит его для вас.

Если вы уничтожаете (утилизируете) это слишком рано, когда страница придет, чтобы распоряжаться ее, она, скорее всего, будет паникой, и некоторые данные, используемые для создания страницы, вероятно, будут потеряны.

Правило пальца - если вы используете spsite.openweb () или иным образом используете новый spweb (), то вы должны избавиться от него сами (или включить в заявление об использовании). Это в равной степени относится к сети, полученной через SPWEBCollection (например, spweb.webs, spsite.allwebs или spweb.getsubwebsforcurrentuser ()).

Другие советы

А Dispose() Метод, если IDisposal Интерфейс - это интерфейс Specifc, который используется, когда объекты блокируют тяжелые и дорогие ресурсы. Например, когда вы приобретаете соединение с базой данных. Метод распоряжения должен сообщить объекту, что я сделал с соединением (в случае SQL), и что вы теперь можете закрыть его и позволить кому -то другому использовать ресурс. В .NET все записано в управляемом коде и автоматически собирается мусор, тогда как соединения SQL и объекты COM+ не выпускаются автоматически.

В случае SharePoint это было обсуждение (уже много лет) о том, когда и как утилизировать объекты. Джеймс хорошо объясняет это с помощью эмпирического правила. Причина, по которой вам необходимо позвонить в утилизацию в некоторых случаях, заключается в том, что SharePoint использует не управляемый код (com+) в SPSite а также SPWeb Объекты, например, сделать вызовы базы данных. Если объекты не утилизируются должным образом, у вас в конечном итоге закончится память, так как сборщик мусора в .NET не может автоматически отпустить объекты «внешний» (до .NET).

В вашем случае вы должны нет использовать using оператор, так как он автоматически утилизирует объект. Заявление об использовании расширяется как это в компиляторе, из

using (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}

к этому:

try (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}
finally {
    web.Dispose();
}

Я тоже ускоряюсь с развитием SharePoint и нашел Утилизировать закономерности по примеру быть отличным ссылком по этому вопросу. Надеюсь, это поможет вам так же сильно, как и мне.

Если вы сомневаетесь в том, правильно ли вы обращаетесь с распоряжением, у Microsoft есть Spdisposecheck Tool Доступен, чтобы проверить это для вас. Вы можете запустить это вручную, непосредственно из Visual Studio или даже включить его в проверку на вашем сервере сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top