Получить SPWEB на всех уровнях
-
28-09-2020 - |
Вопрос
У меня есть корневой сайт с сайтами на разных уровнях (глубина неизвестна).Как я могу найти все объекты SPWEB, итерацию до самого глубокого уровня.
Приведен ли код ниже желаемого результата
SPWebApplication mySPWebApp = SPWebApplication.Lookup(new Uri("http://test-site"));
{
foreach (SPSite siteCollection in mySPWebApp.Sites)
{
foreach (SPWeb oweb in siteCollection.AllWebs)
{
//My Code
}
}
}
. Решение
Да, с spwebaplication.sites Вы получаете все коллекции сайта в веб-приложении и с SPSite.allWebs Вы получаете все сайты в коллекции сайта, независимо от уровня.
Направляющая практика - это явно утилизируйте отдельных веб-сайтов, которые извлекаются из коллекции, возвращаемой через свойство AllWebs.
foreach (SPWeb oweb in siteCollection.AllWebs)
{
try
{
//Your code
}
finally
{
oweb.Dispose();
}
}
.
Вы должны утилизировать коллекции сайта тоже.
Другие советы
Чтобы построить ответ @ Naim, вы должны утилизировать как коллекции сайтов, так и для веб-сайтов, так и использовать TRY / CATCH вокруг утилизации или использования операторов.
Сбор сайта Установите пример утилизации
from Лучшие практики: Использование одноразовых Windows SharePointОбъекты служб
void SPSiteCollectionForEachNoLeak()
{
using (SPSite siteCollectionOuter = new SPSite("http://moss"))
{
SPWebApplication webApp = siteCollectionOuter.WebApplication;
SPSiteCollection siteCollections = webApp.Sites;
foreach (SPSite siteCollectionInner in siteCollections)
{
try
{
// ...
}
finally
{
if(siteCollectionInner != null)
siteCollectionInner.Dispose();
}
}
} // SPSite object siteCollectionOuter.Dispose() automatically called.
}
.
Пример утилизации веб-адреса
from Лучшие практики: Использование одноразовых Windows SharePointОбъекты служб
void SPWebCollectionAddNoLeak(string strWebUrl)
{
using (SPSite siteCollection = new SPSite("http://moss"))
{
using (SPWeb outerWeb = siteCollection.OpenWeb())
{
SPWebCollection webCollection = siteCollection.AllWebs; // No AllWebs leak just getting reference.
using (SPWeb innerWeb = webCollection.Add(strWebUrl))
{
//...
}
} // SPWeb object outerWeb.Dispose() automatically called.
} // SPSite object siteCollection.Dispose() automatically called.
}
.