>Sharepoint webservices framework

>

Het intranet (sharepoint) platform wordt meer en meer gebruikt voor allerhande toepassingen. Alle inschrijvings-web-toepassingen op de http://www.howest.be website werken met sharepoint als onderliggend platform. Daarvoor werd er een framework ontwikkelt die de data wegschrijft naar een custom list.

Via deze list kunnen de organisatoren van het evenement bijhouden hoeveel en welke personen zich hebben ingeschreven. Ze kunnen gebruik maken van de standaard sharepoint functionaliteiten (waarschuwingen, sorteren, filteren, exporteren naar Excel, …).

Onderstaande post geeft je een inzicht in hoe het framework werd opgebouwd:

Sharepoint web services

Sharepoint zit vol met web services. Deze worden out-of-the-box mee geïnstalleerd. Via deze webservices kan je je hele sharepoint omgeving manipuleren. Onderstaande lijst geeft je een overzicht van de verschillende services:

  • http://server/_vti_adm/Admin.asmx : Administrative methods such as creating and deleting sites
  • http://server/_vti_bin/Alerts.asmx : Methods for working with alerts
  • http://server/_vti_bin/DspSts.asmx : Methods for retrieving schemas and data
  • http://server/_vti_bin/DWS.asmx : Methods for working with Document Workspaces
  • http://server/_vti_bin/Forms.asmx : Methods for working with user interface forms
  • http://server/_vti_bin/Imaging.asmx : Methods for working with picture libraries
  • http://server/_vti_bin/Lists.asmx : Methods for working with lists
  • http://server/_vti_bin/Meetings.asmx : Methods for working with Meeting Workspaces
  • http://server/_vti_bin/Permissions.asmx : Methods for working with SharePoint Services security
  • http://server/_vti_bin/SiteData.asmx : Methods used by Windows SharePoint Portal Server
  • http://server/_vti_bin/Sites.asmx : Contains a single method to retrieve site templates
  • http://server/_vti_bin/UserGroup.asmx : Methods for working with users and groups
  • http://server/_vti_bin/versions.asmx : Methods for working with file versions
  • http://server/_vti_bin/Views.asmx : Methods for working with views of lists
  • http://server/_vti_bin/WebPartPages.asmx : Methods for working with Web Parts
  • http://server/_vti_bin/Webs.asmx : Methods for working with sites and subsites

Het framework werd ontwikkelt rond de Lists.asmx service.

Framework

De bedoeling van het framework is om op een snelle manier en zonder veel code te moeten schrijven, data op te halen van een bepaalde list of om data toe te voegen (of aan te bewerken).

Het framework is een class library (Howest.Sharepoint.Data namespace) met 2 classes (Helper en Lists) en 1 proxy class voor je web service connectie.

img1

De web service proxy class is een auto generated class. Je kan deze genereren via wsdl.exe http://server/_vti_bin/lists.asmx -out:outputpath\Reference.vb.

De lists class bevat 4 properties:

  • SiteUrl: de url naar de site waar de lijst staat.
  • Username/password/domain: credentials die nodig zijn om te connecteren naar die site.

Verder bevat de class 2 methods:

  • GetListItems(listGuid, viewGuid, queryCAML), return een Dataset
  • UpdateList(listGuid, itemXML)

Elke lijst in sharepoint krijgt intern een GUID mee. Je kan deze zien wanneer je de instellingen van deze lijst bekijkt.

img2

De GUID van de lijst wordt in html code weergeven. Om de exacte GUID te zien kan je deze website gebruiken:

http://www.albionresearch.com/misc/urlencode.php

Hier kan je deze onleesbare GUID omzetten naar zoiets: {D8D82A2A-CDE2-4F6D-8319-6E1DF164AF10}

Een lijst bevat standaard ook minstens 1 view of weergave. Ook een view heeft een GUID die je kan opvragen door de view te bewerken.

Deze 2 parameters heb je nodig om naar je lijst te connecteren.

Een lijst kan je query’en zoals een tabel uit een database. De taal die hiervoor gebruikt wordt is geen SQL maar CAML (Collaborative Application Markup Language), een op XML gebaseerde taal.

Om je query op te bouwen gebruik je best volgende tool: U2U CAML Query Builder.

img3

De GetListItems method maakt een connectie met de web service en voert de CAML query uit op een lijst, het resultaat krijg je terug in een dataset.

Public Function GetListItems(ByVal listGuid As String, ByVal viewGuid As String, ByVal queryCAML As String) As DataSet

Dim listService As New be.howest.start.Lists(String.Format("{0}/_vti_bin/Lists.asmx", Me._siteUrl))

listService.PreAuthenticate = True

listService.Credentials = New Net.NetworkCredential(Me._username, Me._password, Me._domain)

‘Instantiate an XmlDocument object.

Dim xmlDoc As New System.Xml.XmlDocument()

‘Use the CreateElement method of the document object to create

‘elements for the parameters that use XML.

Dim query As System.Xml.XmlElement = xmlDoc.CreateElement("Query")

Dim viewFields As System.Xml.XmlElement = xmlDoc.CreateElement("ViewFields")

Dim queryOptions As System.Xml.XmlElement = xmlDoc.CreateElement("QueryOptions")

‘To specify values for the parameter elements (optional),

‘assign CAML fragments to the InnerXml property of each element.

viewFields.InnerXml = ""

queryOptions.InnerXml = ""

‘To specify values for the parameter elements (optional),

‘assign CAML fragments to the InnerXml property of each element.

query.InnerXml = queryCAML

‘Declare an XmlNode object and initialize it with the XML response from the GetListItems method.

‘The last parameter specifies the GUID of the Web site containing the list.

‘Setting it to Nothing causes the Web site specified by the Url property to be used.

Dim nodeListItems As System.Xml.XmlNode = listService.GetListItems(listGuid, viewGuid, query, viewFields, 100, queryOptions, Nothing)

Dim sr As New IO.StringReader(nodeListItems.OuterXml)

Dim ds As New DataSet

ds.ReadXml(sr)

Return ds

End Function

De UpdateList method gaat een item (of items) toevoegen of bewerken in een lijst:

Public Sub UpdateList(ByVal listGuid As String, ByVal itemXML As String)

Dim listService As New be.howest.start.Lists(String.Format("{0}/_vti_bin/Lists.asmx", Me._siteUrl))

listService.PreAuthenticate = True

listService.Credentials = New Net.NetworkCredential(Me._username, Me._password, Me._domain)

‘Instantiate an XmlDocument object.

Dim xmlDoc As New System.Xml.XmlDocument()

Dim batch As Xml.XmlElement = xmlDoc.CreateElement("Batch")

batch.SetAttribute("OnError", "Continue")

batch.SetAttribute("ListVersion", "1")

batch.InnerXml = itemXML

listService.UpdateListItems(listGuid, batch)

End Sub

De parameter itemXML bevat een xmlstring waar je de waardes opgeeft die je wil toevoegen of editeren. De opmaak van die xml is als volgt:

<Method ID=’1′ Cmd=’New’>

<Field Name=’Title’>{0}</Field>

<Field Name=’FirstName’>{0}</Field>

<Field Name=’WorkZip’>{0}</Field>

<Field Name=’WorkCity’>{0}</Field>

<Field Name=’EMail’>{0}</Field>

<Field Name=’Geboortejaar’>{0}</Field>

</Method>

Wanneer je in sharepoint met datum velden werkt moeten deze in een bepaald formaat staan, hiervoor wordt de Helper class gebruikt. Deze bevat een method om een datum naar het juiste formaat te converteren:

Public Shared Function GetSharepointDateTime(ByVal value As DateTime) As String

Return String.Format("{0}T{1}Z", value.ToString("yyyy-MM-dd"), value.ToString("hh:mm:ss"))

End Function

Hiermee is het framework klaar. Hoe je het moet gebruiken wordt in een volgende post uitgelegd!