Получение SPWEB в ресивере
-
10-12-2019 - |
Вопрос
При тестировании моего решения я получаю ошибку на активацию функции:
Обнаружено использование SPREQUEST для ранее закрытого объекта SPWEB.Пожалуйста, закройте объекты SPWEB, когда вы закончите всеми объектами, полученными из них, но не раньше.
Это так, как я получаю SPWEB:
.public override void FeatureActivated(SPFeatureReceiverProperties properties) { using (SPWeb web = properties.Feature.Parent as SPWeb) { ClassOfMine.doYourStuff(web); } }
Что я делаю не так?
Решение
Как насчет;
ПРЕДУПРЕЖДЕНИЕ. Ваша функция должна быть определена как в Интернете, чтобы она была очевидно;)
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
// No need to dispose the web istance, as indicated in the "Do not dispose" guidance
SPWeb web = (SPWeb) properties.Feature.Parent; // added semicolon
ClassOfMine.doYourStuff(web);
}
.
не использует функцию:
Если не используйте SPContext, чтобы получить корневую сеть
SPContext.Current.Site.RootWeb
.
или - для текущей сети
SPContext.Current.Web
.
или - для определенного веб-адрена
SPContext.Current.Site.OpenWeb("Website_URL"))
.
Чтобы использовать выше в функции, вам нужно будет использовать свойства:
Используйте свойства, чтобы получить сайт, чтобы получить rootWeb
SPSite site = properties.Feature.Parent as SPSite;
using (SPWeb web = site.RootWeb)
{
}
.
или - для текущей сети
SPWeb web = properties.Feature.Parent as SPWeb;
.
или - для определенного веб-адрена
SPSite site = properties.Feature.Parent as SPSite;
using (SPWeb web = site.OpenWeb("Website_URL"))
{
}
. Другие советы
Вы делаете правильно.Просто объем этой функции должен быть в Интернете.Атрибут «Родитель» всегда является объектом объема функций.
Вы также утилизируете объект с использованием.
Единственная проблема с SPContext - это то, что вы не можете активировать функцию от PowerShell, так как нет HTTP-контекста.