Lists.asmx - GetList

Récupération du schéma XML d'une liste via le WebService

04/03/2009 5 553 lectures 4 commentaires 4.8/5 (6 votes) Sébastien Sougnez

AreaProg recherche des rédacteurs. Plus d'informations

Vous entrez à présent dans une série de cours qui vont porter sur l'utilisation des WebServices SharePoint. Effectivement, utiliser l'Object Model n'est pas très compliqué, mais une fois que vous allez essayer d'instancier un object SPSite depuis une application ne se trouvant pas sur le même serveur que celui qui héberge votre site SharePoint, vous allez ramasser une belle erreur. C'est assez logique. Effectivement, quand vous êtes sur le serveur, vous pouvez faire ce que vous voulez. Ajouter des éléments dans une liste, en supprimer et même, supprimer la liste et tout ça, sans autorisation. Imaginez cela, il vous suffirait de connaitre l'URL d'un site pour pouvoir faire ce que vous voulez depuis un programme développé par vos soins. Il est assez logique du coup, que depuis un pc autre que celui sur lequel est installé SharePoint, il est impossible d'utiliser un objet SPSite. Cepepdant, il peut parfois être très utile de pouvoir utiliser l'Object Model de SharePoint depuis l'extérieur, ne serait-ce que por récupérer les éléments d'une liste. Nous allons donc passer par les WebServices de SharePoint. Il en existe beaucoup, regroupés dans différents fichiers .asmx du dossier _vti_bin de SharePoint. Dans ce cours et dans les prochains, nous allons utiliser le WebService Lists.asmx. Ce WebService va vous permettre d'exploiter les listes SharePoint à distance. Au travers des différents cours sur ce WebService, nous allons utiliser une application Windows Form développée par nos soins. Nous n'expliquerons pas en détails la mise en place de l'aspect graphique de cette application, nous nous contenterons de vous donner le noms des différents contrôles que nous utilisons. Voici à quoi va ressembler l'application graphique dans le cadre de ce cours :
 

Image


Le but de cette application va être assez simple. Nous allons entrer le nom d'une liste et notre programme va se contenter de récupérer le schéma de cette liste. De ce schéma, elle va récupérer tous les champs contenus dans cette liste et en afficher certaines informations essentielles (ID, Name, Display Name et Type). Ouvrez donc Visual Studio et refaites une apparence similaire à celle-ci. Disposez bien ces contrôles dans un TabControl car nous améliorerons cette application dans les prochains cours. La zone de texte la plus au sommet se nomme txtUrl et va contenir l'URL du site que nous voulons utiliser. La zone de texte qui va contenir le nom de la liste se nomme txtNomListe alors que le bouton à sa droite se nomme btnGoList. Nous avons ensuite une grande zone de texte. Modifiez la propriété Multiline de celle-ci sur True et la propriété ScrollBars sur Both. Le nom de cette zone de texte est txtGetList. En dessous, se trouve une ListView nommée lvFields. Dans celle-ci, ajoutez 4 colonnes avec comme intitulé ceux présentés dans la capture d'écran ci-dessus. Enfin, modifiez la propriété View de cette liste sur Details. Il y a une étape essentielle à réaliser pour pouvoir utiliser les WebService SharePoint, c'est à dire, ajouter la référence à un WebService. Une fois cela fait, nous pourrons l'utiliser facilement dans notre code, la seule contrainte sera de changer l'adresse de ce dernier lors de l'exécution du programme. Effectivement, pour faire vos test et vos développements, vous allez vous baser sur les WebService de votre site local. Ensuite, quand vous voudrez utiliser un WebService situé sur un autre serveur, il vous suffira de modifier la propriété Url de celui-ci. Pour ajouter cette référence, cliquez avec le bouton droit de votre souris sur le dossier Reference et cliquez sur Add Service Reference. Dans la fenêtre qui apparaît, cliquez sur Advanced. Dans la fenêtre suivante, cliquez sur Add Web Reference. Dans cette fenêtre, vous devrez rentrer l'URL du WebService que vous allez utiliser pour vos test. L'URL de ce WebService sera : http://site/_vtin_bin/Lists.asmx ou il faudra remplacer site par l'URL de votre site. _vti_bin est le nom du dossier qui contient les WebServices. Lists.asmx est le nom du WebService que nous allons utiliser. Nommez votre référence WSList et validez :
 

Image


Ouvrez maintenant le code-behind de votre form et ajoutez ces directives :
 

using WSLists.WSList;
using System.Xml;


La première va nous permettre d'utiliser la référence que nous venons de créer. Ici, WSLists correspond au nom que nous avons donné au projet, si vous avez nommé votre projet autrement, il vous faudra changer WSLists. WSList correspond au nom que nous avons donné à la référence vers le WebService. Les WebService renvoient un résultat au format XML, nous ajoutons donc la deuxième directive pour pouvoir manipuler aisément le XML dans notre programme. Comme vous pouvez vous en douter, étant donné que l'application est exécutée sur un poste différent que celui où se trouve SharePoint, il existe une certaine sécurité. Pour utiliser un WebService, nous allons donc devoir fournir les identifiants d'un utilisateur autorisé à accéder aux ressources auxquelles vous voulez accéder. Déclarez donc cette variable de classe en dehors de toute fonction :
 

private System.Net.NetworkCredential credential; 


Un objet du type NetworkCredential va contenir les informations d'un membre, ses credentials. Rendez-vous maintenant dans le constructeur et tapez ce code pour initialiser cet objet :
 

credential = new System.Net.NetworkCredential("user", "pass"); 


Nous initialisons l'objet credential avec les informations de l'utilisateur autorisé à utiliser les ressources que nous voulons manipuler. Bien évidemment, vous devrez remplacer user par le nom de l'utilisateur et pass par son mot de passe. Double-cliquez maintenant sur le bouton Go. Dans cet événement, nous allons permettre à notre application de récupérer la définition d'une liste donnée. La première chose à faire est de vérifier si le champ URL du site et Nom de la site sont bien remplis :
 

if (string.IsNullOrEmpty(txtUrl.Text))
{
	MessageBox.Show("Veuillez insérer l'URL du site !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
	txtUrl.Focus();
	return;
}

if (string.IsNullOrEmpty(txtNomListe.Text)) {
	MessageBox.Show("Veuillez insérer le nom de la liste !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
	txtNomListe.Focus();
	return;
}


Ce code vérifie simplement si les deux champs contiennent bien une valeur, rien de bien compliqué. Tapez ensuite ce code :
 

Lists list = new Lists();
string url = txtUrl.Text;

if (url[url.Length - 1] != '/')
	url += '/';

url += "_vti_bin/Lists.asmx";

list.Url = url;
list.Credentials = credential; 


Tout d'abord, nous instancions un objet nommé list de type Lists. Ce type est en fait un type contenu dans la référence vers le WebServices et va nous permettre d'utiliser ce dernier. Nous récupérons ensuite le contenu du champ URL du site dans la variable url. Nous allons ensuite modifier un peu cette URL. Effectivement, tout d'abord nous allons regarder si celle-ci est bien terminée par le caractère /. Nous vérifions cela parce que nous allons devoir ajouter _vti_bin/Lists.asmx à cette URL pour pouvoir joindre le WebService du site en question. Donc, si cette url ne se termine pas par une /, nous la rajoutons et ensuite, nous rajoutons _vti_bin/Lists.asmx. Nous modifions ensuite la propriété Url du WebService pour lui signaler le site à utiliser. Ensuite, nous modifions la valeur de la propriété Credentials pour nous donner accès à la liste. Nous utilisons l'objet credential initialisé dans le constructeur. Continuez en tapant ceci :
 

XmlNode result = list.GetList(txtNomListe.Text);

txtGetList.Text = result.InnerXml; 


Ici, nous nous contentons d'appeler la méthode GetList de l'objet list. Cette méthode permet de récupérer le schema d'une liste dont nous passons le nom en paramètre. Ici, nous passons donc le nom tapé dans le champ Nom de la liste. Nous n'avons intentionnellement pas ajouté de contrôle d'exceptions pour ne pas surcharger le code. Dans un programme réel, vous auriez du mettre cela dans un bloc try ... catch. Le résultat renvoyé par cette fonction est du type XmlNode. Nous affichons le contenu XML de cet objet dans la zone de texte grâce à la deuxième ligne. Passons maintenant au remplissage de la ListView. Tapez donc :
 

lvFields.Items.Clear();

foreach (XmlNode fields in result.ChildNodes[0].ChildNodes)
{
	ListViewItem item = new ListViewItem();

	item.Text = fields.Attributes["ID"].Value;
	item.SubItems.Add(fields.Attributes["Name"].Value);
	item.SubItems.Add(fields.Attributes["DisplayName"].Value);
	item.SubItems.Add(fields.Attributes["Type"].Value);

	lvFields.Items.Add(item);
} 


La première ligne va nous permettre de supprimer tous les éléments contenus dans la liste. Ensuite, nous allons boucler sur tous les éléments contenus dans la collection result.ChildNodes[0].ChildNodes. Effectivement, si vous regardez le contenu de la zone de texte au dessus de la ListView, vous remarquerez que le code XML commence avec une élément Fields qui va contenir des éléments Field qui sont la définition de chaque champs contenus dans la liste. L'élément Fields est donc le noeud 0 des noeud enfants du document. Nous bouclons donc sur tous les neouds enfant de ce noeud. Pour chacun de ces noeud, nous créons un élément que nous ajoutons dans la ListView. Encore une fois, si nous regardons le code XML contenu dans la zone de texte, nous pouvons voir que les éléments Field possèdent certains attributs interessant tels que Name, ID, DisplayName,... Nous en récupérons donc quelques-uns ici et nous les plaçons dans l'élément que nous ajoutons ensuite dans la ListView. Si vous exécutez votre programme sur une liste quelconque, vous devriez obtenir quelque chose dans le style :
 

Image


Comme vous le voyez, la zone de texte contient bien le code XML correspondant au schéma de la liste demandée et la ListView contient bien les champs de cette liste. Bien évidemment, la plupart de ceux ci sont cachés dans SharePoint. Pour en avoir le coeur net, il ne tient qu'à vous d'ajouter une colonne Caché et d'afficher dedans la valeur de l'attribut Hidden des champs.

Noter

Veuillez vous identifier ou vous inscrire pour donner une note à cet article.

Commentaires / Questions

sab (04/03/2010 - 16:17)

Bjr,

Il y a une erreur dans le code :
# if (string.IsNullOrEmpty(txtNomListe.Text))if (string {
# MessageBox.Show("Veuillez insérer le nom de la liste !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
# txtNomListe.Focus();
# return;
# }

Ya le if string en trop.

sab (04/03/2010 - 17:17)

Rebjr,

J'ai un message d'erreur de ce type là (:"La demande a échoué avec l'état HTTP 401 : Unauthorized.") à la ligne
result = list.GetList(txtNomListe.Text);
lorsque j'exécute le programme string.

Je comprends pas d'où proviens l'erreur. Je pense avoir placer de bonnes informations dans le credential:

credential = new System.Net.NetworkCredential("pc154\\administrateur", "admin13");

Je précise que j'exécute le web-service en local.

sab (04/03/2010 - 17:28)

C'est resolu. C'était bien le credential qui n'allait pas.
Il fallait enlever le nom de la machine "pc154"..

Merci pour ce tutorial.

Adrien M (05/05/2010 - 19:36)

Magnifique Post :)

Veuillez vous identifier ou vous inscrire pour réagir à cet article.