Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1655 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [webservice] Envoyer string array

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[webservice] Envoyer string array

n°2379998
matheo265
Posté le 24-03-2021 à 16:35:02  profilanswer
 

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:

mood
Publicité
Posté le 24-03-2021 à 16:35:02  profilanswer
 

n°2380000
matheo265
Posté le 24-03-2021 à 17:20:12  profilanswer
 

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...

n°2380018
Tibar
Posté le 24-03-2021 à 22:14:29  profilanswer
 

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 ?

n°2380021
matheo265
Posté le 25-03-2021 à 08:09:24  profilanswer
 

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

n°2380122
Antac
..
Posté le 26-03-2021 à 07:10:28  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [webservice] Envoyer string array

 

Sujets relatifs
[HTML/JS] Envoyer données formulaire depuis site no-codeEnvoyer des SMS via son forfait 4G et un routeur 4G
[RÉSOLU] Envoyer une liste de noms de fichiers vers un exécutableAfficher un bouton "envoyer" après validation reCAPTCHA
[RESOLU]Comment trier un array à 2 dimensions avec plusieurs critéresErreur : "TypeError: iteration over a 0-d array"
[PHP] Remplacer des mots dans une string par des valeurs d'un tableauarray_filter pour les champs vides, mais pas "0"
string literal contains an unescaped line breakSoucis Regex et string.search javascript
Plus de sujets relatifs à : [webservice] Envoyer string array


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR