Вопрос

У меня есть корневой сайт с сайтами на разных уровнях (глубина неизвестна).Как я могу найти все объекты 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. 
}
.

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