2010-06-30 10 views
1

J'ai actuellement une méthode asmx définie comme ceci:services Web ASMX, et des paramètres clés

[WebMethod] 
public String Method1(Hashtable form) 

Il reçoit des objets JSON avec un nombre variable d'attributs, par exemple:

{"form":{"name1":"10","name2":"20"}} 

C'est fonctionne bien et donne les résultats attendus lorsqu'il est appelé, mais quand j'ouvre l'adresse du service Web dans le navigateur, j'obtiens l'erreur:

Le type System.Collections.Hashtable est pas pris en charge car elle met en œuvre IDictionary

J'ai essayé d'autres types de données, comme List<DictionaryEntry> qui corrigera le problème, mais être vide lorsque la méthode est appelée, et je peux » t trouver quelque chose qui fonctionnera dans les deux cas ...

Quelle est la "bonne" façon de faire cela?

+0

Comment ce travaille avec 'Hashtable' si vous obtenez une exception? –

+0

L'appel de la méthode à partir du script client fonctionne correctement, le seul problème est l'ouverture de la base .asmx. – tjsar

Répondre

1

IDictionaryIDictionary ne peut pas être sérialisé en XML (c'est ainsi que fonctionnent les services Web asmx), vous ne pouvez donc utiliser aucune implémentation de IDictionary en tant que valeur de retour ou en tant que paramètre. Donc la manière "correcte" de faire ceci est d'utiliser tout ce qui ne met pas en œuvre IDictionary. Vous pourriez faire quelque chose comme ceci:

[WebMethod] 
public String Method1(params KeyValuePair<string, string>[] formdata) 

puis l'appeler comme ceci:

service.Method1(new KeyValuePair("name1", "10"), new KeyValuePair("name2", "20")); 
+0

J'ai essayé cette définition de méthode, mais j'ai un "Constructeur non paramétrable défini pour le type d'erreur KeyValuePair []". Je devrais également mentionner que je n'ai aucun contrôle sur les données json entrantes. – tjsar

0

Pour le moment, je peux faire cela comme une solution de contournement:

[WebMethod] 
public String Method1(Object form) 
{ 
    Dictionary<String, Object> data = (Dictionary<String, Object>)form; 

Et la page .asmx du service se charge sans erreur.

Cela rend encore aucun sens pour moi si ...

+0

Je ne vois pas comment cela fonctionnerait ... Les données sont-elles entièrement remplies ou sont-elles nuls? –

Questions connexes