Ottieni SPWEB a tutti i livelli
-
28-09-2020 - |
Domanda
Ho un sito di radice con siti a diversi livelli (la profondità è sconosciuta).Come posso trovare tutti gli oggetti SPWeb Iteraing fino al livello più profondo.
Il seguente codice mi dà il risultato desiderato
SPWebApplication mySPWebApp = SPWebApplication.Lookup(new Uri("http://test-site"));
{
foreach (SPSite siteCollection in mySPWebApp.Sites)
{
foreach (SPWeb oweb in siteCollection.AllWebs)
{
//My Code
}
}
}
. Soluzione
Sì, con SPWeBapplication.sites ottieni tutte le raccolte di siti in un'applicazione Web e con SPSite.allWebs ottieni tutti i siti in una raccolta del sito, indipendentemente dal livello.
.La migliore pratica è di disporre esplicitamente dei singoli siti Web che vengono recuperati dalla raccolta che viene restituita attraverso la proprietà di AllWebs.
foreach (SPWeb oweb in siteCollection.AllWebs)
{
try
{
//Your code
}
finally
{
oweb.Dispose();
}
}
.
Dovresti smaltire anche le raccolte siti.
Altri suggerimenti
Per costruire la risposta di @ Naim, è necessario disporre sia le raccolte del sito che le reti e l'utilizzo di prove / cattura attorno alle istruzioni di smaltimento o utilizzando.
Raccolta del sito Dispose l'esempio
da Best Practices: Utilizzo di Windows SharePoint monousoServizi Oggetti
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.
}
.
Smaltire il Web Esempio
da Best Practices: Utilizzo di Windows SharePoint monousoServizi Oggetti
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.
}
.