дочерний сайт sharepoint дочернего сайта

У меня есть требование зацикливать все библиотеки документов с сервера sharpeoint, однако я не смог на дочернем сайте дочернего сайта

прежде всего я использую метод ниже, чтобы получить мои SiteCollections

internal List<string> GetAllSite()
    {
        List<string> siteCollection = new List<string>();
        try
        {

            SPSecurity.RunWithElevatedPrivileges(delegate ()
            {
                SPServiceCollection services = SPFarm.Local.Services;
                foreach (SPService curService in services)
                {
                    if (curService is SPWebService)
                    {
                        SPWebService webService = (SPWebService)curService;


                        foreach (SPWebApplication webApp in webService.WebApplications)
                        {
                            foreach (SPSite sc in webApp.Sites)
                            {
                                try
                                {
                                    siteCollection.Add(sc.Url);
                                    Console.WriteLine("Do something with site at: {0}", sc.Url);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("Exception occured: {0}\r\n{1}", e.Message, e.StackTrace);
                                }
                            }
                        }
                    }
                }


            });
        }
        catch (Exception ex)
        {

            throw;
        }

        return siteCollection;
    }

после этого я использую URL-адрес возврата сайта для цикла для дочернего сайта, как показано ниже.

 using (SPSite site = new SPSite(SiteCollectionUrl))
                {

                    foreach (SPWeb web in site.AllWebs)
                    {
                          //i get the subsite url from here

                    }

                }

прямо сейчас вот моя проблема, как я упоминал ранее, я хотел получить дочерний сайт дочернего сайта, поэтому я передаю свой URL-адрес дочернего сайта в SPSite, однако он будет только зацикливать SiteCollections вместо моих дочерних сайтов

foreach (SPWeb web на site.AllWebs) ‹- я имею в виду здесь, здесь будет только цикл моего элемента коллекции sitecollection, хотя я уже передал свой URL-адрес дочернего сайта в качестве параметров


person roy    schedule 08.03.2017    source источник


Ответы (1)


Если вам нужны только прямые дочерние дочерние сайты данного сайта, вам следует использовать _ 1_ вместо свойства SPSite.AllWebs.

Получает объект коллекции веб-сайтов, который представляет все веб-сайты, расположенные непосредственно под веб-сайтом, за исключением дочерних этих веб-сайтов.

using (SPSite siteCollection = new SPSite(SiteCollectionUrl))
{
    using(SPWeb parentSite = siteCollection.OpenWeb())
    {
       foreach (SPWeb subsite in parentSite.Webs)
       {
            // do something with subsite here
            subsite.Dispose();
       }
    }
    siteCollection.Dispose();
}

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

Обратите внимание, что создание и удаление объектов SPWeb для каждого дочернего сайта может снизить производительность.

Если вам не нужен доступ ко всем свойствам каждого дочернего сайта, лучше использовать свойство AllWebs семейства сайтов, чтобы получить ссылку на объект SPWebCollection. Затем вы можете использовать свойство WebsInfo этого SPWebCollection, чтобы получить List<> легких объектов SPWebInfo, как указано в этот ответ.

person Thriggle    schedule 08.03.2017