2009-05-06 5 views
2

J'ai un système basé sur le Web où les utilisateurs devraient être en mesure d'extraire des données d'un service Web en entrant l'URL et les valeurs de paramètres nécessaires. Mon problème est, d'une manière ou d'une autre, de trouver la structure des paramètres requis dans le corps du savon, qui n'est pas nécessairement une ou deux chaînes, mais qui pourrait être un arbre entier.Obtention de paramètres pour le service Web par programme?

La transmission n'est pas un problème, car il s'agit simplement de XML.

Comment faire? Ai-je besoin de lire l'intégralité du schéma WSDL et d'essayer de le comprendre ou existe-t-il un moyen plus simple? Je sais que .NET peut générer du code pour cela, mais puis-je trouver facilement quelles classes auraient été générées sans vraiment le générer et utiliser la réflexion pour savoir ce qu'il a fait?

Est-ce que quelqu'un a une idée?

Répondre

4

Vous pouvez utiliser la classe ServiceDescription, qui vous donne un modèle d'objet représentant votre fichier wsdl.

Si vous voulez essayer un wrapper utile, faites-le post.

+0

Cela aurait pu résoudre mon problème, s'il n'y avait pas deux choses: 1.L'emballage n'obtient que le premier niveau de paramètres. Si le paramètre est de type complexe, je n'ai toujours pas la définition de ce type complexe. Cependant ceci peut être facilement résolu avec quelques modifications au code. 2. Au moins un des fichiers WSDL de test que j'utilise possède des liaisons pour Soap, HttpGet et HttpPost. Je n'arrive pas à comprendre par programme quel est le savon. Une idée de comment je peux le faire en utilisant la classe ServiceDescription? – janzi

0

Je ne l'ai jamais fait, mais je crois que .net vous permet de générer dynamiquement des proxies. Vous devriez alors être capable de refléter les classes générées. Je ne vois pas ce qui fonctionne bien pour autre chose que des interfaces simples.

+0

J'ai déjà essayé ça. Cependant cela crée de nouveaux assemblages que je dois charger afin de réfléchir sur eux. Malheureusement, ces assemblages ne peuvent pas être facilement déchargés (à moins de créer un nouveau AppDomain) même s'ils ne seront jamais utilisés à nouveau, c'est pourquoi je voudrais trouver les paramètres sans réellement créer et charger un assembly. – janzi

0

Je vois 3 options:

a) contacter l'éditeur du service Web et demander des échantillons de documentation et le code.

b) Utilisez Visual Studio pour générer les classes proxy. Puis étudiez le code généré pour comprendre comment vous pouvez le faire vous-même sans le code généré. Vous devez comprendre le fonctionnement de la classe XMLSerializer car cette classe est utilisée pour convertir les types générés en XML.

c) Lire la description WSDL pour comprendre les paramètres attendus et leur format.

Hope this helps,

Sly

+0

Le problème est que je ne sais pas à quels services Web le système va communiquer à l'avance. Si je le savais, je pourrais aussi bien ajouter la référence Web et l'utiliser à la place. Essentiellement, j'essaie de fournir à mes utilisateurs un moyen d'importer des données provenant d'autres systèmes à la demande. – janzi

+0

janzi - Je suis désolé; Je n'ai pas compris que vous deviez découvrir et invoquer des services lors de l'exécution. Vous allez essentiellement réécrire la logique Ajouter une référence de service Web pour découvrir ce qu'est le service et comment l'appeler. Dans ce cas, je ne connais pas d'autre moyen que d'analyser le WSDL. – Sylvain

0

Essayez d'utiliser ChannelFactory. Cela vous permettra d'appeler dynamiquement un webservice à l'exécution et de créer le client proxy. J'ai vu votre commentaire sur le chargement et le déchargement des assemblages. Utilisez le proxy du client avec la réflexion et lorsque vous avez fini de le jeter.

0

Ce problème est difficile à résoudre pour le cas général. Et si l'un des "paramètres" du service est un document XML? Et si c'est un type complexe? Comment allez-vous générer une interface utilisateur pour permettre l'entrée de telles choses?

Vous pouvez également regarder dans soapUI. Par ailleurs, créer un nouveau domaine d'application pour charger des assemblys n'est pas difficile. En fait, c'est plutôt facile.

Questions connexes