質問

私は異なるレベルのサイトを持つルートサイトを持っています(深さは不明です)。どのように最深レベルまで繰り返すすべての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 サイトコレクションのすべてのサイトをすべてあっても、すべてのサイトを表示します。

ベストプラクティスは、AllWebSプロパティを通して返されるコレクションから取得された個々のWebサイトを明示的に配置することです。

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

サイトコレクションも廃棄する必要があります。

他のヒント

@ NAIMの答えを築くためには、サイトコレクションとウェブの両方を処分して、処分またはステートメントを使用して試してみると、

サイトコレクションの処分例

ベストプラクティス:使い捨ての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.
}
.

Web処分例

ベストプラクティス:使い捨ての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