子网站的sharepoint子网站

时间:2017-03-08 08:10:55

标签: c# sharepoint sharepoint-2016

我需要从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;
    }

之后我使用return sitecollection url循环子网站,如下面的代码

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

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

                    }

                }

现在这是我的问题,正如我之前提到的,我想获得子网站的子网站,所以我将我的子网站网址传递给SPSite,但它只会循环SiteCollections而不是我的子网站

foreach(SPWeb web in site.AllWebs)&lt; - 我的意思是这里,这里只会循环我的sitecollection项目,我已经将我的子网站url作为参数传递

1 个答案:

答案 0 :(得分:0)

如果您只想要某个网站的直接后代子网站,则应使用SPWeb.Webs属性而不是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属性来获取对{{1}的引用对象。然后,您可以使用SPWebCollection的{​​{1}}属性来获取WebsInfo轻量级SPWebInfo对象,如this answer中所述。