[webservice] Envoyer string array

Envoyer string array [webservice] - C#/.NET managed - Programmation

Marsh Posté le 24-03-2021 à 16:35:02    

Bonjour tout le monde  :hello:  
 
Le sujet de ce post ressemble à un sujet que j'ai vu de nombreuses fois sur le forum sans pour autant trouver une solution qui fonctionne pour moi...
 
J'ai développé un webservice en c#, et une des méthodes récupère 2 paramètres : une chaîne et un tableau de chaînes :
 

Code :
  1. [WebMethod]
  2. public void ExtraitCommandes(string applicatif, string[] files)
  3. {
  4.       foreach (string file in files) Log(string.Format("file={0}",file));
  5. }


 
Pour l'exemple je me contente d'afficher les différentes chaînes envoyées en paramètre dans mon tableau, Log étant une méthode qui écrit dans un fichier de log.  ;)  
 
Mon objectif est de faire appel à ce webservice à partir d'une page web (ajax). Je tiens à préciser que plusieurs autres méthodes de mon webservice fonctionnent parfaitement bien, mais ces méthodes ne nécessitent pas de tableau en paramètres...  :whistle:  
 
Mon appel ajax de base :
 

Code :
  1. $.ajax({
  2.       url: "https://monsite.com/MonWebservice.asmx/ExtraitCommandes",
  3.       type: "post",
  4.       data: {
  5.          applicatif: currentApplicatif,
  6.          files: uploadFiles
  7.       },
  8.       dataType: "json",
  9.       success: function(response){
  10.          console.log(response);
  11.       },
  12.       error: function(error){
  13.          console.log(error);
  14.       }
  15. });


 
uploadFiles est un tableau de chaînes ["chaine1","chaine2","chaine3"].
 
Maintenant le problème  :D Impossible d'obtenir le résultat que je souhaite, à savoir extraire dans mon webservice les différentes chaînes du tableau envoyé !
 
Si j'utilise mon appel ajax tel que ci-dessus, mon webservice renvoi l'erreur suivante :  
 

Citation :

System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.


 
J'ai essayé d'utiliser un JSON.stringify() comme j'ai pu voir sur plusieurs sujets :
 

Code :
  1. data: JSON.stringify({
  2.       applicatif: uploadAapplicatif,
  3.       files: uploadData
  4. }),


 
Ce qui me renvoie l'erreur suivante :
 

Citation :

System.InvalidOperationException: Paramètre manquant : applicatif.


 
J'ai essayé de "stringifier" uniquement le paramètre "files" :
 

Code :
  1. data: {
  2.       applicatif: uploadAapplicatif,
  3.       files: JSON.stringify(uploadData)
  4. },


 
Mais mon webservice ne voit qu'une seule et unique chaîne, comme en témoigne la ligne dans mon fichier de logs :
 

Citation :

file=["machaine1","machaine2","machaine3"]


 
Du côté de mon webservice justement, j'ai essayé de changer le type du paramètre :  
 

Code :
  1. public void ExtraitCommandes(string applicatif, List<string> files)


 
Mais là aussi, erreur :
 

Citation :

System.InvalidOperationException: Le nom de la méthode web Service ExtraitCommandes n'est pas valide.


 
Voilà où j'en suis... Est-ce que quelqu'un a une idée de l'endroit où j'ai bien pu me foirer... ?  :heink:  
 
Merci pour votre aide  :jap:

Reply

Marsh Posté le 24-03-2021 à 16:35:02   

Reply

Marsh Posté le 24-03-2021 à 17:20:12    

Comme souvent, après des heures à chercher, il suffit d'un post sur le forum pour que je trouve rapidement la solution...   :sarcastic:  
 
Enfin... "solution" est un grand mot car ça ressemble à du bidouillage  :heink:  
 
Côté ajax j'ai "stringifié" uniquement mon paramètre "files" :
 

Code :
  1. data: {
  2.       applicatif: currentApplicatif,
  3.       files: JSON.stringify(uploadFiles)
  4. },


 
Et côté webservice, j'ai changé le type de mon paramètre en string puis j'ai utilisé un JavaScriptSerializer pour décrypter ma chaîne :
 

Code :
  1. [WebMethod]
  2. public void ExtraitCommandes(string applicatif, string files)
  3. {
  4.       JavaScriptSerializer json = new JavaScriptSerializer();
  5.       List<string> filesTab = json.Deserialize<List<string>>(files);
  6.       foreach (string file in filesTab) Log(file);
  7. }


 
Je ne comprends pas pourquoi je suis obligé de faire appel à un JavaScriptSerializer alors que partout sur le net les gens y arrivent sans, mais il faut croire que quelque chose dans ma config m'oblige à ça... Où que les exemples que j'avais trouvé (remontant pourtant à 2019 pour certains !) sont aujourd'hui obsolètes...

Reply

Marsh Posté le 24-03-2021 à 22:14:29    

Salut,
 
En fait c'est assez simple, même si pas forcément idéal. Ton webservice est développé dans un langage, ici C#. Ton code appelant ce service est du javascript. Les types de données proposées par ces langages ne sont pas forcément "identiques" :  
Types en javascript :  
https://blog.lesieur.name/les-types [...] %20%C2%BB.
 
Types en C# :  
https://docs.microsoft.com/fr-fr/do [...] eric-types
 
Comme ton service est accessible par ton code, mais que potentiellement d'autres développeurs voudront l'appeler avec leur propre langage (Python, Ruby, etc.), il faut trouver une façon de présenter les données de manière universelle.  C'est à ça que sert le format Json.  
 
Ca implique par contre de tester que ce que tu reçois correspond bien au type attendu, et de prévoir les erreurs à générer en cas de mauvaise donnée. Par exemple, en C#, la valeur max d'un INT est 2 147 483 647.
Si ce n'est pas la même limite en Javascript, tu pourrais très bien déclarer une variable en INT dans ton code Javascript et l'envoyer à ton webservice, qui va provoquer une erreur car il ne pourra pas instancier la variable qui réceptionne avec la valeur passée.
 
Je suis intéressé par les exemples que tu avais trouvé par contre ?

Reply

Marsh Posté le 25-03-2021 à 08:09:24    

Merci Tibar pour ta réponse et tes explications.
 
Je comprends qu'effectivement un type (hors primitifs) peut être différent d'un langage à un autre ce qui est assez logique. Mais ce qui m'a enduit en erreur c'est ces nombreux exemples où ils se contentent d'envoyer un json avec stringify et que côté c# ils récupèrent ça sans faire appel à un JavaScriptSerializer.
 
Voici plusieurs exemples (liste loin d'être exhaustive), et contrairement à ce que j'ai cru il n'y en a aucun en provenance de ce forum :
 
https://forums.asp.net/t/1654103.as [...] nto+Jquery
https://forums.asp.net/t/1703889.as [...] arameters+
https://stackoverflow.com/questions [...] s-using-jq
https://stackoverflow.com/questions [...] -webmethod

Reply

Marsh Posté le 26-03-2021 à 07:10:28    

Le célèbre problème du string dans l'array...

Reply

Sujets relatifs:

Leave a Replay

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