すべてのレベルでSPWebを入手してください
-
28-09-2020 - |
質問
私は異なるレベルのサイトを持つルートサイトを持っています(深さは不明です)。どのように最深レベルまで繰り返すすべての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.
}
. 所属していません sharepoint.stackexchange