我有一个具有不同级别的站点的根网站(深度未知)。如何找到所有SPWeb对象迭代到最深层面。

以下代码会给我想要的结果

SPWebApplication mySPWebApp = SPWebApplication.Lookup(new Uri("http://test-site"));
{
    foreach (SPSite siteCollection in mySPWebApp.Sites)
    {
        foreach (SPWeb oweb in siteCollection.AllWebs)
        {
            //My Code
        }
    }
}
.

有帮助吗?

解决方案

是,使用 spwebapplication.sites 您可以在Web应用程序中获取所有网站集,并使用spsite.allwebs 您可以在网站集中获取所有网站,无论级别。

最佳实践是在从AllWeb属性返回的集合中检索的单个网站上进行处理。

foreach (SPWeb oweb in siteCollection.AllWebs)
{
     try
     {
           //Your code
     }
     finally
     {
          oweb.Dispose();
     }
}
.

您也应该处理网站集。

其他提示

要在@ naim的答案上,您应该处理站点集合和网站和网站,并在处理或使用陈述时使用尝试/捕获。

网站集处理示例

使用一次性窗口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.
}
.

Web处置示例

使用一次性窗口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归因
scroll top