Obtendo Pastas Utilizando o WebService Lists.ASMX do SharePoint 2010

Lendo um post no fórum do MSDN com o título Recuperar ID de pasta na Biblioteca usando Web Services fiquei curioso com o problema reportado, que era conseguir consultar uma pasta do SharePoint passando o nome dela e retornando o ID, utilizando o webservice Lists.ASMX.

Este post tem um exemplo de como implementar esta necessidade.

Antes de iniciar, vale lembrar que existem outras formas mais recomendas de acessar dados remotamente do SharePoint, como por exemplo o Client Object Model ou o serviço REST, mas como a solicitação era via webservice, vou deixar o exemplo na mesma linha. O código deste post foi copiado do post original do fórum e adaptado para que funcione corretamente.

Neste exemplo, a biblioteca do SharePoint possui as pastas na seguinte estrutura:

  1. Pasta1
    1. PastaA
      1. Folder1
      2. Folder2
      3. Folder3
    2. PastaB
    3. PastaC
  2. Pasta2
  3. Pasta3

O primeiro passo para começar o desenvolvimento é adicionar a referência do webservice no Visual Studio, que fica no endereço http://enderesite/_vti_bin/lists.asmx, conforme mostra a imagem 01.

WebService_CAML_GetFolderByName02

Imagem 01: Adicionando a referência do Webservice SharePoint

 

Criei uma classe chamada Pasta para conter a nossa lógica, ela possui as propriedades ID e Nome e o método RecuperaPasta que faz a busca no SharePoint. A listagem 01 tem a implementação completa da classe.

public class Pasta
{
    public int ID { get; set; }
    public string Nome { get; set; }

    /// <summary>
    /// Busca a pasta em uma biblioteca do SharePoint utilizando os webservices
    /// </summary>      
    public void RecuperaPasta(string nomePasta, string nomeBiblioteca)
    {
        WebServiceLists.Lists service = new WebServiceLists.Lists();
        service.Url = "
http://lab-sp04/_vti_bin/lists.asmx";
        service.Credentials = new System.Net.NetworkCredential("usuario", "senha", "dominio");
       
        XmlDocument xDoc = new XmlDocument();
        XmlNode ndQuery = xDoc.CreateNode(XmlNodeType.Element, "Query", "");
        XmlNode ndViewFields = xDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
        XmlNode ndQueryOptions = xDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
       
        ndQuery.InnerXml = "<Where>" +
                            "<And>" +
                                "<Eq>" +
                                    "<FieldRef Name=\"FileLeafRef\" />" +
                                    "<Value Type=\"Text\">" + nomePasta + "</Value>" +
                                "</Eq>" +
                                "<Eq>" +
                                    "<FieldRef Name=\"FSObjType\" />" +
                                    "<Value Type=\"Lookup\">1</Value>" +
                                "</Eq>" +
                            "</And>" +
                            "</Where>";

        ndViewFields.InnerXml = "";
        // O RecursiveAll eh fundamental para que a busca seja feita nas subpastas
        ndQueryOptions.InnerXml = "<QueryOptions><ViewAttributes Scope=’RecursiveAll’/></QueryOptions>";

        XmlNode resultNode = service.GetListItems(nomeBiblioteca, string.Empty, ndQuery, ndViewFields, null, ndQueryOptions, null);

        // Le os nodes de retorno
        foreach (XmlNode node in resultNode.ChildNodes)
        {
            if (node.Name == "rs:data")
            {
                for (int i = 0; i < node.ChildNodes.Count; i++)
                {
                    if (node.ChildNodes[i].Name == "z:row")
                    {
                        // Le os atributos dos nodes
                        foreach (XmlAttribute attr in node.ChildNodes[i].Attributes)
                        {
                            if (attr.Name == "ows_ID")
                                this.ID = int.Parse(attr.Value);
                            else if (attr.Name == "ows_FileRef")
                                this.Nome = attr.Value;
                        }
                    }
                }
            }
        }
    }
}

Listagem 01: Implementação da classe Pasta

 

Com a implementação da classe Pasta, agora temos que testá-la. A listagem 02 mostra as chamadas de teste.

class Program
{
    static void Main(string[] args)
    {
        Pasta pasta = new Pasta();

        Console.WriteLine("Obtendo Pasta1");
        pasta.RecuperaPasta("Pasta1", "Documentos");
        Console.WriteLine(string.Format("ID: {0} – Pasta: {1}", pasta.ID.ToString(), pasta.Nome));

        Console.WriteLine("Obtendo PastaA");
        pasta.RecuperaPasta("PastaA", "Documentos");
        Console.WriteLine(string.Format("ID: {0} – Pasta: {1}", pasta.ID.ToString(), pasta.Nome));

        Console.WriteLine("Obtendo Folder1");
        pasta.RecuperaPasta("Folder1", "Documentos");
        Console.WriteLine(string.Format("ID: {0} – Pasta: {1}", pasta.ID.ToString(), pasta.Nome));
        Console.ReadKey();
    }
}

Listagem 02: Testando a classe Pasta

 

Ao executar o teste, o resultado exibido na imagem 02 é exibido.

WebService_CAML_GetFolderByName01

Imagem 02: Executando a pesquisa das pastas

 

Verifique que as três chamadas do método foram executadas com sucesso, retornando o ID e o Nome da pasta e apenas uma pasta por vez.

 

Referências

Anúncios

3 Respostas to “Obtendo Pastas Utilizando o WebService Lists.ASMX do SharePoint 2010”

  1. Building a Multi-Server SharePoint Farm in Windows Azure « Jivane's Blog Says:

    […] Obtendo Pastas Utilizando o WebService Lists.ASMX do <b>SharePoint</b> <b>…&… […]


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: