Lors d'un appel au Web Service Lists.asmx et plus exactement à la méthode GetListItems, il est souvent nécessaire de passer des paramètres de types XML. Ces paramètres sont mal interprétés, rendant ainsi l'utilisation du Web Service difficile voire impossible.
Les paramètres XML sont indiqués dans InfoPath sous la forme d'une chaîne de caractères (ceci dit de l'XML, ce n'est jamais que des caractères qui respectent des règles prédéfinies).
C'est cette chaîne qui, une fois encodée pour être envoyée, n'est plus compréhensible par le Web Service.
Une fois le problème repéré, des tests montrent que l'appel du Web Service depuis une application .NET se fait sans aucun souci. Sur base de ces informations, une solution s'offre à nous: utiliser un Web Service (écrit en .NET) que l'on déploie au sein de SharePoint afin de générer le message à envoyer de manière correcte.
<WebMethod()> _
Public Function GetListItems(ByVal listName As String, ByVal viewID As String, ByVal query As String, ByVal viewFields As String, ByVal rowLimit As String, ByVal queryOptions As String, ByVal webID As String) As XmlNode
Dim service As SharePointListsWS.Lists = GetWebServiceInstance(webID)
Dim queryElement As XmlNode = CreateNode("Query", query)
Dim viewFieldsElement As XmlNode = CreateNode("ViewFields", viewFields)
Dim queryOptionsElement As XmlNode = CreateNode("QueryOptions", queryOptions)
Return service.GetListItems(listName, viewID, queryElement, viewFieldsElement, rowLimit, queryOptionsElement, webID)
End Function
Private Function GetWebServiceInstance(ByVal webID As String) As SharePointListsWS.Lists
Dim service As New SharePointListsWS.Lists
service.Credentials = System.Net.CredentialCache.DefaultCredentials
service.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx"
Return service
End Function
Private Function CreateNode(ByVal name As String, ByVal innerXml As String)
Dim document As New XmlDocument
Dim node As XmlNode = document.CreateElement(name)
node.InnerXml = innerXml
Return node
End Function
Ce Web Service, après avoir générer du XML valide et compréhensible, passe les paramètres au Web Service Lists.asmx qui, cette fois, pourra interpréter les paramètres en entrée. Les valeurs retournées par celui-ci sont quant à elle directement renvoyées vers le client appelant.
Ce qu'il vous faut donc savoir pour réaliser ce Web Service intermédiaire:
- Comment écrire un Web Service;
- Comment permettre de l'intégrer dans SharePoint;
- Comment le déployer dans SharePoint.
Il existe de nombreux articles discutant de chacun des points. Pour simplifier la vie aux personnes qui ne souhaitent pas trop de temps, je vous joins un fichier zippé comprenant l'ensemble des fichiers nécessaires pour installer un tel Web Service: Téléchargement
La procédure se résume donc par:
- Dézippez le fichier;
- Appuyez sur install.bat.
Attention! La version actuelle de ce package fait que le fichier spdisco.aspx existant sur le serveur est remplacé par celui présent dans le package. Il est par ailleurs supprimé lors d'un retract de la solution. Faites un backup préalablement.