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
        }
    }
}
Foi útil?

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. 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top