PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Service web WCF (à la Microsoft)
Service web WCF (à la Microsoft)
Débuté par LC90176, 31 oct. 2012 14:29 - 4 réponses
Membre enregistré
34 messages
Popularité : +1 (1 vote)
Posté le 31 octobre 2012 - 14:29
Bonjour,

WinDev 17 (ou 18) sait-il consommer des services Web WCF ?
De même, sait-il créer ce type de services ?

Ce serait pour interagir avec Sharepoint.

Merci pour les réponses.
Posté le 30 novembre 2012 - 12:21
Bonjour,

Je suis à la recherche d'une solution aussi ...

Mes requêtes SOAP vers WDSL(Lists.asmx)Sharepoint 2010 passent avec [ HTTPParamètre(httpParamètreMode,1) => gestion de l'authentification via IE] et j'aurais voulu implémenter WCF pour s'authentifier avec login et pwd.

Merci pour vos réponses
Membre enregistré
203 messages
Posté le 30 novembre 2012 - 19:15
Bonjour,

Ici on manipule des listes Sharepoint. Comme on a eu des difficultés pour utiliser directement le WebService on a fait une DLL maison en C#. La Dll manipule le WebService. Widev appelle la DLL pour lui demander une liste en texte ou envoyer une requête de mise à jour.

Cordialement,

Alex
Membre enregistré
203 messages
Posté le 30 novembre 2012 - 19:21
Extraits de code :

using System;
using System.Xml;

namespace Wssp
{
PUBLIC class WsspClass
{
// Variable globale pour la classe, initialisée avec InitSite
PRIVATE static Site.Lists l = new Site.Lists();


PUBLIC static bool InitSite(string pUrlService)
{
l.UseDefaultCredentials = True;
l.Credentials = System.Net.CredentialCache.DefaultCredentials;
l.Url = pUrlService;
RETURN True;

}

PUBLIC static string GetListAndView(string pListName, string pViewName = "")
{
xmlNode n = l.GetListAndView(pListName, pViewName);
RETURN n.OuterXml;
}

PUBLIC static string GetListCollection()
{

string sRes = string.Empty;
string sNeud = string.Empty;

xmlNode n = l.GetListCollection();
foreach (xmlNode m IN n)
{
sNeud = m.OuterXml;
//sNeud = xmlnode.InnerXml;
//sNeud = xmlnode.Attributes["Title"].Value;
sRes += sNeud + Environment.NewLine;
}

RETURN sRes;

}

PUBLIC static xmlNode GetListItems(string pIdElem, string pNomListe)
{

XMLDocument xD = new XMLDocument();
xD.LoadXml("<Document><Query><Where><Eq><FieldRef Name='Title' /><Value Type='Text'>"
+ pIdElem + "</Value></Eq></Where></Query><ViewFields /><QueryOptions /></Document>");

xmlNode nQ = xD.SelectSingleNode("//Query");
xmlNode nV = xD.SelectSingleNode("//ViewFields");
xmlNode No = xD.SelectSingleNode("//QueryOptions");

xmlNode n = l.GetListItems(pNomListe, "", nQ, nV, null, No, null);

RETURN n;

}

PUBLIC static string GetListItemsS(string pIdListe, string pQuery, ref string pErr)
{

string sRes = string.Empty;

XMLDocument xR = new XMLDocument();
xR.LoadXml(pQuery);

xmlNode nQ = xR.SelectSingleNode("//Query");
xmlNode nV = xR.SelectSingleNode("//ViewFields");
xmlNode No = xR.SelectSingleNode("//QueryOptions");

try
{
xmlNode xRes = l.GetListItems(pIdListe, "", nQ, nV, null, No, null);
sRes = xRes.OuterXml;
}
catch (System.Web.Services.Protocols.SoapException x)
{
pErr = x.Detail.InnerText;
}

RETURN sRes;

}

PUBLIC static bool UpdateListItems(string pIdListe, string pReq, ref string pErr)
{
bool bRes = True;

XMLDocument d = new XMLDocument();
d.LoadXml(pReq);
XMLElement b = d.DocumentElement;

// Execute la requête
try
{
l.UpdateListItems(pIdListe, b);
}
catch (System.Web.Services.Protocols.SoapException x)
{
pErr = x.Detail.InnerText;
bRes = False;
}

RETURN bRes;

}

}
}


Procedure PRIVÉE GLOBALE gbSpTrouveListe(stL est un stListeEtVue dynamique, LOCAL sNomListe est une chaîne, LOCAL sUrl est une chaîne, LOCAL sIdVue est une chaîne)

sXmlListes, sXmlListe, sXmlListEtVue, sXmlElements est une chaîne
sErr, sIdListe, sListeTitre est une chaîne
oX,oL est un cXml
bRes est un booléen
sChamps est une chaîne
sViewFields est une chaîne
sReqPage est une chaîne

// Liste
nLi1PageSuivante,nLiNbEle est un entier
sLiJetonPageSuivante, sLiPage est une chaîne

// Init DLL
SI sUrl<>"" ALORS
WsspClass.InitSite(sUrl)
FIN

// Liste listes
sXmlListes = WsspClass.GetListCollection()
POUR TOUTE CHAINE sXmlListe DE sXmlListes SEPAREE PAR RC
// Données de base Liste
oX:mbXmlInitialiseUTF8(sXmlListe)
sListeTitre = oX:msXmlLit("@Title")// Demandes Audiovisualles
sIdListe = oX:msXmlLit("@Name")// {AC69E522-95BD-4436-BED6-9637E591441F}
// Liste trouvée
SI sIdListe=sNomListe ALORS
// Recupére le viewname
sXmlListEtVue = WsspClass.GetListAndView(sIdListe,sIdVue)
SI oX:mbXmlInitialiseUTF8(sXmlListEtVue) ALORS
sIdVue = oX:msXmlLit("/ListAndView/View/@Name")
sViewFields = oX:msXmlExtrait("ViewFields")

sXmlElements = ""
sLiJetonPageSuivante = ""
nLi1PageSuivante=1
TANTQUE Vrai

// Lit une page
SI sLiJetonPageSuivante<>"" ALORS
nLi1PageSuivante+=nLiNbEle
//sLiJetonPageSuivante+="&PageFirstRow="+nLi1PageSuivante+"&View="+sIdVue
FIN
sReqPage = ::gsSpReqSelect(sChamps, sViewFields, sLiJetonPageSuivante)
QUAND EXCEPTION DANS
sLiPage = WsspClass.GetListItemsS(sNomListe, sReqPage, sErr)
FAIRE
sLiPage = ""
FIN
// Nb ele + jeton page suivante
nLiNbEle=0
sLiJetonPageSuivante=""
SI oL:mbXmlInitialiseUTF8(sLiPage) ALORS
nLiNbEle = oL:msXmlLit("/listitems/rs:data/@ItemCount")
sLiJetonPageSuivante = oL:msXmlLit("/listitems/rs:data/@ListItemCollectionPositionNext")
FIN

// Ajout page
sXmlElements +=[RC]+sLiPage

// page vide ou pas ?
SI sLiJetonPageSuivante="" ALORS
SORTIR// vide -> on sort
FIN
FIN

bRes = Vrai
SORTIR
FIN
FIN
FIN

SI bRes ALORS
stL.sListeTitre = sNomListe
stL.sListeId = sIdListe
SI sUrl<>"" ALORS stL.sUrl = sUrl
stL.sVueId = sIdVue
stL.sXmlElements = sXmlElements
stL.sCol = sChamps
FIN

RENVOYER bRes


Procedure PRIVÉE mbSpEcrit(stL est un stListeEtVue dynamique)

sReq, sErr est une chaîne
bRes est un booléen

sReq=[
<Batch
OnError='Continue'
ListVersion='1'
ViewName='%1'>
<Method ID='%2' Cmd='Update'>
<Field Name='ID'>%2</Field>
<Field Name='MessageErreurOREX'>%3</Field>
<Field Name='Erreur_x0020_technique'>%4</Field>
<Field Name='Erreur_x0020_contenu'>%5</Field>
<Field Name='Statut_x0020_validation'>%6</Field>
</Method>
</Batch>
]
// modif Bruno le 22/08/2011 : ajout ligne "Statut... " ci-dessus
SI :bErrTechnique ET :bErrContenu ALORS
// Les deux cases ne doivent pas être cochées en même temps !!!
:mbMessageAjoute("Détécté (Erreur Technique) ET (Erreur Contenu) -> Annule erreur contenu !!!")
// On annule la case Erreur Contenu
:bErrContenu=Faux
FIN

:sErrMessage = Remplace(:sErrMessage,"<","(")
:sErrMessage = Remplace(:sErrMessage,">",")")
:sErrMessage = TexteVersXML(:sErrMessage)
sReq=ChaîneConstruit(sReq, stL.sVueId, :sId, :sErrMessage, :bErrTechnique, :bErrContenu, :sStatutDoc) // ajout Bruno le 22/08/20111 :sStatutDoc
bRes = WsspClass.UpdateListItems(stL.sListeId, sReq, sErr)

RENVOYER bRes
Membre enregistré
203 messages
Posté le 30 novembre 2012 - 19:35
Un autre bout de code :

Procedure PRIVÉE GLOBALE gsSpReqSelect(sChamps est une chaîne, LOCAL sViewFields est une chaîne, LOCAL sJetonPageSuivante est une chaîne)

sWhere, sReq est une chaîne
oX est un cXml
nEle est un entier
sOptions est une chaîne
sChamps = ""

sViewFields = ChaîneConstruit([
<ViewFields>
%1
</ViewFields>
],sViewFields)

SI oX:mbXmlInitialiseUTF8(sViewFields) ALORS
nEle = oX:mnXmlCount("/ViewFields/FieldRef")
SI nEle>0 ALORS
POUR nCpt = 1 A nEle
sChamps+=[RC]+oX:msXmlLit("/ViewFields/FieldRef["+nCpt+"]/@Name")
FIN
FIN
FIN

sWhere = [
<Eq>
<FieldRef Name='Statut_x0020_validation' />
<Value Type='Choice'>Publiable</Value>
</Eq>
]
// A FAIRE : Supprimer cette ligne en prod
sWhere=""

sReq = [
<Document>
<Query>
<Where>
%2
</Where>
</Query>
%1
%3
</Document>
]

// Ex1 :
//<QueryOptions>
//<Paging ListItemCollectionPositionNext="
//Paged=TRUE&p_ID=100&View=
//%7bC68F4A6A%2d9AFD%2d406C%2dB624%2d2CF8D729901E%7d&PageFirstRow=
//101" />
//</QueryOptions>
// Ex 2 :
//<QueryOptions>
//<Paging ListItemCollectionPositionNext='Paged=TRUE&p_ID=100&View=%7bC68F4A6A%2d9AFD%2d406C%2dB624%2d2CF8D729901E%7d&PageFirstRow=16' />
//</QueryOptions>
SI sJetonPageSuivante="" ALORS
sOptions = "<QueryOptions/>"
SINON
sOptions = [
<QueryOptions>
<Paging ListItemCollectionPositionNext='%1' />
</QueryOptions>
]
sJetonPageSuivante = TexteVersXML(sJetonPageSuivante)
sOptions = ChaîneConstruit(sOptions, sJetonPageSuivante)
FIN

sReq = ChaîneConstruit(sReq,sViewFields,sWhere,sOptions)

RENVOYER sReq