webservice C# et consommation SOAP : problème de namespace

webservice C# et consommation SOAP : problème de namespace - C#/.NET managed - Programmation

Marsh Posté le 05-10-2010 à 17:30:19    

Bonjour,
 
J'ai un petit problème dans la construction de mon webservice.
Je dois construire un webservice avec une méthode qui doit consommer la demande SOAP suivante :
 

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  2.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4.     <soapenv:Body>
  5.         <GetDefaultInputFieldMapping xmlns="http://www.esri.com/schemas/ArcGIS/9.3"/>
  6.     </soapenv:Body>
  7. </soapenv:Envelope>


 
or mon code :

Code :
  1. [WebMethod(MessageName = "GetDefaultInputFieldMapping", Description = "Procédure privée - ne pas utiliser" )]
  2.         [System.Web.Services.Protocols.SoapDocumentMethod(RequestNamespace = "http://www.esri.com/schemas/ArcGIS/9.3", ResponseNamespace = "http://www.esri.com/schemas/ArcGIS/9.3", ResponseElementName = "GetDefaultInputFieldMappingResponse" )]
  3.         public PropertySet GetDefaultInputFieldMapping()
  4.         {
  5.             try
  6.             {
  7.                 PropertySet resultat = new PropertySet();
  8.                 PropertySetProperty[] resultat_Array = new PropertySetProperty[2];
  9.                 resultat_Array[0] = new PropertySetProperty();
  10.                 resultat_Array[0].Key = "Zone";
  11.                 resultat_Array[0].Value = "Zip, Zipcode, City, Zone";
  12.                 resultat_Array[1] = new PropertySetProperty();
  13.                 resultat_Array[1].Key = "Street";
  14.                 resultat_Array[1].Value = "Address, Addr, Street";
  15.                 resultat.PropertyArray = resultat_Array;
  16.                 return resultat;
  17.             }
  18.             catch (Exception e)
  19.             {
  20.                 // erreur pendant la FindAddressCandidates
  21.                 log.Error(" GetDefaultInputFieldMapping : erreur" );
  22.                 log.Error(" Détail : " + e.Message.ToString());
  23.                 return null;
  24.             }
  25.         }


 
me génére la demande SOAP suivante :
 

Code :
  1. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  2. <SOAP-ENV:Body>
  3.  <m:GetDefaultInputFieldMapping xmlns:m="http://www.esri.com/schemas/ArcGIS/9.3"/>
  4. </SOAP-ENV:Body>
  5. </SOAP-ENV:Envelope>


 
et je ne sais pas du tout comment virer le préfixe m:  pour avoir une balise sans prefixe (ce qui va poser problème dans le programme qui va utiliser ce webservice).
Quelqu'un aurait donc une idée de comment faire pour ne plus avoir le prefixe  ?
Merci d'avance.


---------------

Reply

Marsh Posté le 05-10-2010 à 17:30:19   

Reply

Marsh Posté le 05-10-2010 à 20:30:15    

lordankou a écrit :

ce qui va poser problème dans le programme qui va utiliser ce webservice.


Pourquoi, il est con comme un bol et infoutu de comprendre des namespaces XML? Tu réalises que dans ce cas il va pas être capable de bouffer ta requête, parce que tu utilises pas le même alias de namespace pour ton enveloppe soap que dans ton exemple?

lordankou a écrit :

Quelqu'un aurait donc une idée de comment faire pour ne plus avoir le prefixe  ?


Comprendre les namespaces XML serait probablement un bon début.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-10-2010 à 23:03:08    

masklinn a écrit :


Pourquoi, il est con comme un bol et infoutu de comprendre des namespaces XML? Tu réalises que dans ce cas il va pas être capable de bouffer ta requête, parce que tu utilises pas le même alias de namespace pour ton enveloppe soap que dans ton exemple?


 
je dois considérer en effet que le programme qui va utiliser ce webservice est con comme un bol. Je n'ai strictement aucun controle sur ce qu'il fait avec ce webservice. J'ai juste une trace dans un fichier de log des requêtes et réponse SOAP envoyer au webservice. A moi ensuite de me débrouiller avec ça pour construire un webservice qui génère à l'identique ces requêtes et réponses (sauf 2 paramètres en entrée et 2 en sortie qui sont variables)
 

masklinn a écrit :


Comprendre les namespaces XML serait probablement un bon début.


 
ça je me doute mais je ne sais pas où commencer. je ne peux pas non plus passer trop de temps dessus (le coeur du programme c'est la géolocalisation pas cette partie là mais qui reste néanmoins essentielle). Bref comment faire pour adapter mon webservice en C# pour qu'il génére correctement les bonnes requêtes et réponses SOAP (et donc s'occuper des namespace)


---------------

Reply

Marsh Posté le 06-10-2010 à 10:38:54    


 
 
en fait mon problème de namespace est double. Je le rencontre à la fois en entrée et en sortie.  
En entrée si je ne prefixe pas mes balises par ce "m:" je n'arrive pas à récupérer les objets passés en paramètre  :(  
 
En sortie j'essaie d'avoir la même structure pour que l'appli cliente ne plante pas. Peut être que l'appli cliente va reconnaitre le namespace sans problème ou peut être que tout sera transformer en chaine de caractère et que l'appli cliente var récupérer le caractère 120 de la chaîne. Je n'ai aucun moyen de le savoir à part de le tester chez le client et d'attendre le fichier de log de la part de ce dernier (et le client a bien sur pas que ça à faire ce que je comprends).  
 
 
en fait pour faire un petit résumé ce que je ne comprends pas c'est pourquoi via le code suivant :
 

Code :
  1. namespace webService_Geolocalisation
  2. {
  3. [WebService(Namespace = "http://www.esri.com/schemas/ArcGIS/9.3" )]
  4. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  5.      
  6. [WebMethod(Description = "Procédure privée - ne pas utiliser" )]
  7.         [XmlInclude(typeof(PointN))]
  8.         public ESRI.ArcGIS.ADF.ArcGISServer.RecordSet FindAddressCandidates(PropertySet Address, PropertySet PropMods)
  9.         { 
  10.             …
  11.   }
  12. }


 
il n'est pas capable de récupérer la valeur d'Adresse via la requête :
 

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  2.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4.     <soapenv:Body>
  5.         <FindAddressCandidates xmlns="http://www.esri.com/schemas/ArcGIS/9.3">
  6.             <Address xmlns="">
  7.                 <PropertyArray>
  8.                     <PropertySetProperty>
  9.                         <Key>String</Key>
  10.                         <Value/>
  11.                     </PropertySetProperty>
  12.             </Address>
  13.             <PropMods xmlns="">
  14.                 <PropertyArray>
  15.                     <PropertySetProperty>
  16.                         <Key>String</Key>
  17.                         <Value/>
  18.                     </PropertySetProperty>
  19.                 </PropertyArray>
  20.             </PropMods>
  21.         </FindAddressCandidates>
  22.     </soapenv:Body>
  23. </soapenv:Envelope>


 
alors qu'il arrive avec :
 

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  2.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4. <soapenv:Body>
  5.  <m:FindAddressCandidates xmlns:m="http://www.esri.com/schemas/ArcGIS/9.3">
  6.   <m:Address>
  7.    <PropertyArray>
  8.     <PropertySetProperty>
  9.      <Key>String</Key>
  10.      <Value/>
  11.     </PropertySetProperty>
  12.    </PropertyArray>
  13.   </m:Address>
  14.   <m:PropMods>
  15.    <PropertyArray>
  16.     <PropertySetProperty>
  17.      <Key>String</Key>
  18.      <Value/>
  19.     </PropertySetProperty>
  20.    </PropertyArray>
  21.   </m:PropMods>
  22.  </m:FindAddressCandidates>
  23. </soapenv:Body>
  24. </soapenv:Envelope>


 
La seule différence c'est le namespace "m:" et je ne comprends pas pourquoi il ne veut pas marcher avec la première requête SOAP.  :(


---------------

Reply

Marsh Posté le 06-10-2010 à 12:32:55    


 
 
hélas non je ne sais pas du tout quelle techno utilise l'appli cliente. la seule chose dont je dispose c'est le fichier de log avec les requêtes SOAP. c'est un peu léger mais bon ...
 
Pour les webservices au lieu de WCF pas le choix non plus


---------------

Reply

Marsh Posté le 08-10-2010 à 13:44:13    

est ce qu'il faudrait que je rajoute quelque chose à cette partie là :
 

Code :
  1. [WebService(Namespace = "http://www.esri.com/schemas/ArcGIS/9.3" )]


 
pour dire qu'il ne faut jamais rajouter de suffixe ?


---------------

Reply

Marsh Posté le 08-10-2010 à 15:11:00    


 
hélas non j'ai toujours un suffixe. peut importe que je rajoute ou pas un namespace il va me le faire automatiquement quand je génére la requête via SOAPUI et n'acceptera pas de requête sans un suffixe  :(  
 


---------------

Reply

Marsh Posté le 08-10-2010 à 16:59:11    

disons que ça marche presque  :pt1cable:  
 
il ne me rajoute plus le suffixe avec le namespace mais du coup quand je fais appelle à ma requette FindAdresseCandidates avec le code suivant :
 

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  2.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4.     <soapenv:Body>
  5.         <FindAddressCandidates xmlns="http://www.esri.com/schemas/ArcGIS/9.3">
  6.             <Address xmlns="">


 
il ne trouve pas la variable Address.
Par contre si je vire le  xmlns="http://www.esri.com/schemas/ArcGIS/9.3" (ce que je ne peux pas faire car je ne controle pas cette partie) tout fonctionne parfaitement.
 
J'ai tenté de rajouter au début de la méthode de mon webservice :
 

Code :
  1. [SoapDocumentMethodAttribute(RequestNamespace = "http://www.esri.com/schemas/ArcGIS/9.3", ResponseNamespace = "http://www.esri.com/schemas/ArcGIS/9.3" )]


 
mais ça ne marche plus du tout avec ou sans le xmlns="http://www.esri.com/schemas/ArcGIS/9.3" dans la requête SOAP.
 
Bref je me rapproche de la solution finale mais c'est toujours pas ça...  :cry:


---------------

Reply

Marsh Posté le 11-10-2010 à 10:03:09    


 
désolé j'ai du mal m'exprimer mais je dispose bien du code du FindAddressCandidates. Par contre je ne controlle pas ce qui est envoyé au webservice (généré par un autre programme) et je dois envoyer une réponse conforme au fichier de log que je dispose. c'est pas l'idéal du tout pour développer mais je n'ai pas vraiment le choix.  :(  
 


---------------

Reply

Marsh Posté le 11-10-2010 à 14:25:15    

Tout d'abord un grand désolé pour mes réponses mais je pensais avoir déjà répondu (à force d'expliquer un peu à tout le monde le problème je me perds dans ce que j'ai déjà dit)
 

Citation :


Qu'est-ce que tu as essayé à partir du lien que j'ai donné ?


j'ai rajouté au début de mon webservice le code suivant pour ne plus avoir de suffixe devant mon namespace :
 

Code :
  1. [WebService(Namespace = "" )]
  2. [WebServiceBinding(ConformsTo = WsiProfiles.None)]


 
ce qui a eu pour effet de virer tout mes suffixe "m:" dans ma requête SOAP.
Or je voudrais conserver le namespace "http://www.esri.com/schemas/ArcGIS/9.3" pour ma méthode FindAdresseCandidates mais sans que ce namespace soit préfixé par quoique ce soit c'est à dire que dans ma requête SOAP avoir :
 

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  2.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  4.     <soapenv:Body>
  5.         <FindAddressCandidates xmlns="http://www.esri.com/schemas/ArcGIS/9.3">
  6.             <Address xmlns="">


 
or pour l'instant si je rajoute ce xmlns="http://www.esri.com/schemas/ArcGIS/9.3" je n'arrive pas à appeller ma méthode FindAddressCandidates. En supprimant le xmlns="http://www.esri.com/schemas/ArcGIS/9.3"  de ma requête SOAP je n'ai pas de problème.  
Le problème c'est que je dois créer une méthode de mon webservice qui doit recevoir cette requête SOAP et non créer une requête SOAP qui soit compatible avec la méthode de mon webservice.
 
Je dispose et je peux modifier à volonté le code de mon webservice (webservice qui contient donc la méthode FindAdresseCandidate).
 
Encore une fois désolé pour le manque de clarté dans mes propos (à force de jongler entre les projets et technologie je mélange absoluement tout  :( ) et surtout un grand merci de prendre le temps de tenter de répondre à mes questions  :jap:


---------------

Reply

Marsh Posté le 11-10-2010 à 14:25:15   

Reply

Marsh Posté le 11-10-2010 à 16:27:18    


 
merci beaucoup pour les liens !
je regarderai ça dans la semaine (enfin si j'ai le temps  :( )


---------------

Reply

Marsh Posté le 14-10-2010 à 16:35:22    

bon bah je laisse tomber.  
J'ai tout essayer mais il me rajoute systématiquement un prefixe à mon namespace.  
bref je vais tenter de brancher le webservice comme ça en espérant que ça marche sinon et bien tant pis je ne peux pas inventer ce que je ne connais pas  :cry:


---------------

Reply

Marsh Posté le 12-08-2015 à 10:07:20    

Enfaite il existe plusieurs format d'encodage soap :
voici un lien qui explique trés bien ceci :  
http://www.jmdoudoux.fr/java/dej/chap-service-web.htm
 
Il faut donc ajouter des attribut à ton webservice correspondant à l'encodage de la requête qu'on t'envoie.
https://msdn.microsoft.com/fr-fr/li [...] .100).aspx
 
pour ton cas je pense qu'il faut rajouter ceci :
 [SoapDocumentService(Use=SoapBindingUse.Literal,ParameterStyle=SoapParameterStyle.Bare)]
 
++

Reply

Marsh Posté le 13-08-2015 à 09:07:03    

J'espère qu'il avait trouvé une solution tout seul depuis le temps :D


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed