SharePoint proporciona una serie de web services para facilitarnos un poco la vida.
Podéis ver el listado en esta página del MSDN.
En este ejemplo vamos a centrarnos en uno de los más útiles, el que nos permite hacer consultas a listas.
Evidentemente, podríamos crear nuestro objeto SPQuery y usarlo para obtener los resultados con el método SPList.GetItems, pero con el web service tendremos el resultado con los nombres internos originales de las columnas de la lista.
Primero añadimos el web service, desde el Solution Explorer, en la carpeta References, añadimos una Web Reference:
Y en el popup introducimos la url del top level site del site collection y "/_vti_bin/lists.asmx".
Recordad que los web services que proporciona Sharepoint los encontramos en la 12 hive (C:\Program Files\Common Files\Microsoft Shared\web server extensions\12), en la carpeta "ISAPI".
Vti_bin es virtual folder que apunta a esa carpeta física.
Una vez insertada esa URL obtendréis un listado con los métodos que publica el web service de lists:
Como veis tenemos muchas funcionalidades, así que antes de programar cualquier cosa, os recomiendo que comprobéis que esa funcionalidad no está implementada en algún web service.
Dentro del listado tenemos el método GetListItems.
Podéis cambiar el nombre del a Web reference, que por defecto es el nombre de la máquina, y entonces seleccionáis "Add Reference".
En este ejemplo la referencia la llame "WSLists"
Dentro de vuestro código podéis instanciar el web service de este modo:
WSLists.Lists webServiceLists = new getEventsRSS.WSLists.Lists();
Con ese objeto ya podéis accede a sus propiedades y métodos, como por ejemplo, cambiar en tiempo de ejecución la URL a la que hace referencia:
webServiceLists.Url = sURL;
Para hacer la consulta necesitamos:
- El nombre de la lista.
- El GUID de la view, para que las propiedades (pej query, fields, rowlimit…) se cojan directamente de la view. Estos parámetros se pueden sobreescribir poniéndolos explícitamente en la llamada al método (si la view tiene un rowlimit de 100 pero le pasamos el parámetro rowlimit de 200, se usará 200).
- La quey en formato CAML.
- Los fields que queremos visualizar. Tiene que ser de tipo System.Xml.XmlNode.
- Rowlimit para especificar el número de elementos devueltos por la consulta. Si es null se devuelven todos.
- queryOptions. También en Xml para indicar opciones como la inclusión de las columnas obligatorias y otras opciones del objeto SPQuery.
Este sería un ejemplo de uso:
private
static
void CallWebService(string sEventsList, SPQuery query, string sURL)
{
XmlDocument xmlDoc = new System.Xml.XmlDocument();
XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode ndOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
ndOptions.InnerXml = "<ExpandRecurrences>TRUE</ExpandRecurrences>";
ndQuery.InnerXml = query.Query;
ndViewFields.InnerXml = "<FieldRef Name=\"RecurrenceData\" />";
WSLists.Lists webServiceLists = new getEventsRSS.WSLists.Lists();
webServiceLists.Url = sURL;
webServiceLists.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlNode ndListItems = webServiceLists.GetListItems(sEventsList, null, ndQuery, ndViewFields, null, ndOptions, null);
}
De esta forma obtendríamos un resultado así:
Como veis tenemos los campos originales, y la consulta nos ha costado muy poco de hacer.