Bonjour.
J'ai une question plus qu'un problème, en fait...
Voilà, j'ai créé un Service Web en DotNet, et je me suis attaqué au client avec Delphi 6. J'ai donc utilisé l'expert WSDL pour générer les classe delphis necessaires, et fait un petit programme test.
Mais, ça a planté. Apres un peu de recherche, je me suis rendu compte que c'est l'apel au web service qui n'etait pas bon. J'ai intercepté le message SOAP envoyé par Delphi à mon web service, et l'ai comparé à un message envoyé par infopath (qui fonctionne, lui, très bien)
voilà ce que ça donne :
en DELPHI :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 POST /WSOffice/Service1.asmx HTTP/1.1 Cache-Control: no-cache Connection: Keep-Alive Content-Length: 9120 Content-Type: text/xml Accept: text/xml Host: localhost User-Agent: Borland SOAP 1.1 SOAPAction: "http://tempuri.org/AppelServeur" <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <AppelServeur xmlns="http://tempuri.org/"> <data> <client> ... </client> <environement> ... </environement> <fichiers> <fichier> ... </fichier> </fichiers> </data> </AppelServeur> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Infopath :
Comme vous pouvez le constater, la différence majeure se situe au niveau de data, avec, en delphi, aucun namespace, et avec infopath, le namespace correcte qu'attends le service web.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 POST /WSOffice/Service1.asmx HTTP/1.1 Cache-Control: no-cache Connection: Keep-Alive Content-Length: 9542 Content-Type: text/xml; charset="UTF-8" Host: localhost User-Agent: SOAP Toolkit 3.0 SOAPAction: "http://tempuri.org/AppelServeur" <?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <tns:AppelServeur xmlns:tns="http://tempuri.org/"> <s1:data xmlns:s1="http://www.monentreprise.fr/serveur/client"> <s1:client> ... </s1:client> <s1:environement> ... </s1:environement> <s1:fichiers> <s1:fichier> ... </s1:fichier> </s1:fichiers> </s1:data> </tns:AppelServeur> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Ce qui explique pourquoi le service web ne comprend pas le message envoyé, et génére une exception dont j'ai oublié le type.
pourtant, dans les classes gégénére, delphi a pris en compte les espaces de nommage. Alors, je ne comprends pas où est la faute. Comment peut on demander à Delphi d'utiliser les espaces de nom ? quelqu'un a une idée ?
En attendant, j'ai effacé tout les espaces de nom coté web service, et du coup, lui et Delphi se comprennent. Je ne trouve pas ça génial, puisque du côté serveur également, les classes sont générés automatiquement à partir de schémas xml. Ce qui veux dire que si un jour il y a une modification dans le schéma, non seulement, il faudra régénérer les classes serveur, mais aller les tripatouiler à la main. Puis, générer les classes coté client Delphi.
Partager