Obtenha SPWeb em todos os níveis
-
28-09-2020 - |
Pergunta
Eu tenho um site raiz com sites em diferentes níveis (a profundidade é desconhecida).Como posso encontrar todos os objetos SPWeb iterando até o nível mais profundo.
o código abaixo me dará o resultado desejado
SPWebApplication mySPWebApp = SPWebApplication.Lookup(new Uri("http://test-site"));
{
foreach (SPSite siteCollection in mySPWebApp.Sites)
{
foreach (SPWeb oweb in siteCollection.AllWebs)
{
//My Code
}
}
}
Solução
Sim, com SPWebApplication.Sites você obtém todos os conjuntos de sites em um aplicativo da web e com SPSite.AllWebs você obtém todos os sites de um conjunto de sites, independentemente do nível.
A prática recomendada é descartar explicitamente sites individuais recuperados da coleção retornada por meio da propriedade AllWebs.
foreach (SPWeb oweb in siteCollection.AllWebs)
{
try
{
//Your code
}
finally
{
oweb.Dispose();
}
}
Você também deve descartar conjuntos de sites.
Outras dicas
Para aproveitar a resposta de @naim, você deve descartar os Conjuntos de Sites e as webs e usar try/catch em torno das instruções de descarte ou de uso.
Exemplo de descarte de conjunto de sites
de Melhores Práticas:Usando objetos descartáveis do Windows SharePoint Services
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.
}
Exemplo de descarte da Web
de Melhores Práticas:Usando objetos descartáveis do Windows SharePoint Services
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.
}