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:
- Pasta1
- PastaA
- Folder1
- Folder2
- Folder3
- PastaB
- PastaC
- PastaA
- Pasta2
- Pasta3
O primeiro passo para começar o desenvolvimento é adicionar a referência do webservice no Visual Studio, que fica no endereço https://enderesite/_vti_bin/lists.asmx, conforme mostra a imagem 01.
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 = "https://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.
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
SharePoint 2010 Client Object Model (https://msdn.microsoft.com/en-us/library/ee537247%28v=office.14%29.aspx)
SharePoint Foundation REST Interface (https://msdn.microsoft.com/en-us/library/ff521587%28v=office.14%29.aspx)
Search document from document library usin CAML query (https://sharepoint.stackexchange.com/questions/59323/search-document-from-document-library-usin-caml-query)
Recuperar ID de pasta na Biblioteca usando Web Services (https://social.msdn.microsoft.com/Forums/pt-BR/sharepointpt/thread/b5d622a1-96d7-4f4b-9e17-05fc365c15d4)