0. Introduction▲
InfoPath permet de se connecter à différentes sources de données si on connecte une liste SharePoint à un formulaire InfoPath on pourra rendre son contenu dynamique et ne pas avoir à republier un formulaire à chaque changement. Par default lorsque l'on utilise le wizard d'InfoPath pour créer une nouvelle data connexion vers une liste SharePoint, le compte utilisé est celui de l'usager courant. C'est le fonctionnement standard et cela fonctionne très bien dans la plupart des cas. Toutefois, il arrive que l'on est besoin d'utilisé un formulaire sans forcément que notre ordinateur soit dans le même domaine, dans ce cas on devra se résoudre à s'authentifier plusieurs fois pour chacune de nos data connexions.
Cet article vous montreras comment récupérer l'information grâce à un compte de service et donc de ne plus vous authentifier pour chaque data connexion.
I. Configuration du formulaire▲
Nous utiliserons le C# comme langage. On se rend dans « Tools », « Form Option », « Security and trust », dans « Securtitylevel », on sélectionne full trust et on signe notre template de formulaire.
On se rend aussi dans « programming » et on choisi C# comme langage de programmation.
II. Création de la source XML▲
InfoPath permet de se connecter à différentes sources de données si on connecte une liste SharePoint a un formulaire on pourra rendre son contenu dynamique et ne pas avoir a republier un formulaire a chaque changement. Nous utiliserons une data connexion de type xml afin d'interroger une liste SharePoint. Nous utiliserons pour cela la owssvr.dll vous trouverez ici un article qui parle de son fonctionnement.
Dans un navigateur, on entre l'url qui va nous fournir notre XML :
Identifier le GUID de la liste et de la vue
Voici les étapes pour récupérer ces ID :
1. Naviguer jusqu'à la liste
2. Aller dans les paramètres de la vue (on clique sur modifier cet affichage)
3. Dans la barre d'adresse, il faut copier l'information contenu dans « List= » et « View »
4. Le GUID doit avoir le format « {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}» Pour cela il faut remplacer « %7b » par le caractère « { », « %2D » par « - » et « %7D » par le caractère « }
Si les ID sont correctement configurer le navigateur devrait vous renvoyer un fichier XML :
On sauvegarde ensuite ce fichier, « fichier », « save as », comme type on choisie XML et on entre un nom « categorie.xml ».
III. Création de la data connexion▲
Dans « data source », on sélectionne « manage data connections », « Add », « Receive Data »
On choisi comme type de donnée « XML » et on entre le chemin de notre fichier xml que l'on a sauvegardé précédemment.
On inclut les données dans le Template de notre formulaire et on clique sur « next », on déselectionne « Automatically retreive data when for mis opened » et on clique sur« Finish ».
IV. Création d'un événement sur le « On-Load »▲
On clique sur « Tool», « programming», « loadingevent », une fenêtre de programmation VSTA devrait s'ouvrir.
Voici une fonction à ajouter après la fonction FormEvents_Loading. Cette fonction va intéroger la liste Sharepoint avec le compte de service que l'on aura entrer en paramètre.
public
bool
loadXMLValue
(
string
URL,
string
itemGUID,
string
userName,
string
password,
string
domainName,
XPathNavigator DataConnectionRoot,
XmlNamespaceManager nsMgr)
{
XmlDocument xml =
new
XmlDocument
(
);
try
{
//creation de la requete
String Query =
URL +
"/_vti_bin/owssvr.dll?Cmd=Display&List="
+
itemGUID +
"&XMLDATA=TRUE&noredirect=true"
;
System.
Net.
HttpWebRequest webrequest =
(
HttpWebRequest)WebRequest.
Create
(
Query);
HttpWebResponse webresponse;
webrequest.
PreAuthenticate =
true
;
// on utilise les credentials passé en parametre s'il ne sont pas null ni vide.
NetworkCredential authentication;
if
(!
string
.
IsNullOrEmpty
(
userName))
authentication =
new
System.
Net.
NetworkCredential
(
userName,
password,
domainName);
else
authentication =
System.
Net.
CredentialCache.
DefaultNetworkCredentials;
webrequest.
Credentials =
authentication;
//on interroge le Web service puis on met le résultat dans un xmldocument
webresponse =
(
HttpWebResponse)webrequest.
GetResponse
(
);
StreamReader loResponseStream =
new
StreamReader
(
webresponse.
GetResponseStream
(
));
string
Response =
loResponseStream.
ReadToEnd
(
);
xml.
LoadXml
(
Response);
//on remplace la valeur par défaut de la data connection par le xml qu'on viens de récupérer
XPathNavigator rsData =
xml.
CreateNavigator
(
).
SelectSingleNode
(
"//rs:data"
,
nsMgr);
DataConnectionRoot.
SelectSingleNode
(
"//rs:data"
,
nsMgr).
ReplaceSelf
(
rsData);
return
true
;
}
catch
{
return
false
;
}
}
Dans la fonction FormEvents_Loading, on entre le code qui va appeler cette fonction
bool
rec =
loadXMLValue
(
"http:// SharepointSite"
,
"{GUIDLIST}"
,
"{GUIDVIEW}"
,
"Username"
,
"Password"
,
"Damainname"
,
DataSources[
"Categorie"
].
CreateNavigator
(
),
this
.
NamespaceManager);
V. Conclusion▲
A chaque ouverture du formulaire la liste sera interrogée avec le compte de service.