C# web-service client: plusieurs web-service méthodes avec le même (complexe) type de retour?
Je suis en usant à la construction d'un client pour un Java web B2B-services à l'instant et je pense avoir identifié la cause d'un problème que nous avons eu pendant quelques temps. Malheureusement, je suis incapable d'afficher le fichier WSDL.
Apparemment, mon auto-généré du code proxy (via wsdl.exe: utiliser WSE 3.0 en raison de la WCF pas l'appui de hachage de mot de passe) n'est pas en mesure de gérer le web service WSDL avoir plusieurs web-méthodes avec le même complexe de type de retour.
Prendre pour exemple - un web-service qui définit les méthodes suivantes:
Public ComplexTypeX Blah();
Public ComplexTypeX Blue();
Public ComplexTypeX Foo();
Public ComplexTypeY Bar();
Dans ma Référence.cs fichier, si j'en commentaire, tout le code qui appelle toutes les deux de Bla(), Blue() ou Foo(), puis le reste sans commentaire méthode peut être appelée pas de problème. Cependant, si j'ai plus d'une de ces trois méthodes qui ne sont pas commentées (par exemple, Bla() et Foo()), puis je reçois le message d'erreur suivant lors de l' instanciation de la web-service client code:
"Méthode Bla ne peut pas être pris en compte."
"L'élément XML 'ComplexTypeX" de
espace de noms ' http://some.url références
une méthode et un type. Modifier la
la méthode nom du message à l'aide de
WebMethodAttribute ou de modifier le
type de l'élément racine à l'aide de la
Attribut xmlrootattribute."
Maintenant, il n'y a certainement pas de ComplexTypeX
méthode définie dans le cadre de la web-service, donc je ne peux que supposer que .NET (ou au moins wsdl.exe) ne vous permet pas d'utiliser un service web qui renvoie complexe (défini par l'utilisateur) types du même type dans plusieurs méthodes ... droit?
OriginalL'auteur Bernard | 2009-02-24
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré un problème similaire, et voici ce que j'ai trouvé:
J'avais défini un type complexe pour revenir comme réponse:
Notez qu'ici le nom exact de couplage de Foo/Foo+Réponse est importante. Quand j'ai changé le nom de la méthode comme suit, le problème a disparu:
Je crois que ce qui se passe à l'est .NET est de tenter de automatiquement automatiquement la réponse en provenance de la méthode Foo avec un élément nommé FooResponse. L'utilisation de cette même nom que l'objet que vous voulez retourner crée l'ambiguïté. Essayez de changer le nom de votre objet de réponse, ou le nom de votre méthode pour éviter cette collision.
OriginalL'auteur Ryan Morlok
J'ai juste cherché "fait référence à une méthode et un type" et a trouvé un Connect rapport de bug "Système.InvalidOperationException: L'élément XML * de l'espace de noms * les références une référence à une méthode et un type". Dans ce cas, il s'agit d'une opération et d'un élément avec exactement le même nom (à la fois locale nom et l'espace de noms).
Il est intéressant de noter une partie de la réponse de Microsoft:
OriginalL'auteur John Saunders
J'ai trouvé un autre cas qui soulèvent l'erreur! Voici mon code:
Ok, laissez-moi vous expliquer: le type de retour
CheckUpdateResponse
est une structure,CheckUpdate()
est la méthode. Donc, dans le fichier WSDL .NET ajouter automatiquement un "Response
" suffixe le nom de la méthodeCheckUpdate
dans l'un des élément XML pour décrire la valeur de retour de la méthode.Et voilà: il a trouvé un double élément et l'erreur "Modifier la méthode du message nom à l'aide de WebMethodAttribute..."
Solution? J'ai renommé le type de retour de "CheckUpdateResult" et maintenant, tout fonctionne bien!
J'espère que cela va aider quelqu'un!
OriginalL'auteur Seraphim's
C'est incorrect. Imaginez combien de douleur que ce serait si c'était vrai, vous ne pourriez jamais avoir une méthode qui renvoie une Chaîne de caractères, celui qui renvoie un Double, celui qui renvoie SomeObject, etc... ce serait un cauchemar.
Je ne suis pas très familier avec les web services .NET, mais les erreurs que vous obtenez il semble que vous rencontrez des problèmes avec les espaces de noms XML - peut-être il y a une collision de nom. Je serais tenter de suivre la suggestion dans le message d'erreur pour modifier les
WebMethodAttribute
.Aussi en plus, si vous ne parvenez pas à envoyer un morceau de code/document lié à la difficulté que vous rencontrez en raison de certaines de confidentialité de la compagnie/la sensibilité des questions, vous devriez poster une version aseptisée qui prouve encore votre cas de test. Presque rien "sensibles" devraient pouvoir être réduit à une beaucoup plus simple extrait de code qui obtient toujours votre point de vue sans trahir aucune sensibilité.
OriginalL'auteur matt b
Très étrange. Normalement, le WSDL serait de fournir un type commun, et lorsqu'il est compilé par le biais de wsdl.exe ou svcutil.exe, vous obtenez un commun partagé de type à utiliser dans n'importe quel nombre de méthodes dans la même interface.
Il y a eu des problèmes lors de la consultation de multiples indépendant WSDL est dans la même application, qui partagent ostensiblement type identique, ce qui résulte en distinguer deux types CLR généré. Il y a des façons de contourner ce problème - il est assez bien connu. Ensuite, il est plutôt liées au problème de la cartographie d'une entreprise existante de l'objet à un type généré à partir d'un WSDL. Un autre déjà exploré le paysage.
Mais vous parlez de quelque chose de différent.
Pour le partage de types, voir search.msn.com/... - il y a un article de 2002 qui traite avec wsdl.exe et il y a des articles plus récents pour svcutil (WCF).
OriginalL'auteur Cheeso
Utilisation WSDL.exe a un interrupteur /sharetypes. Cela devrait prendre soin de la question.
D'ailleurs, je ne serait pas d'accord que c'est un Microsoft chose que même les classes sont exposés sous forme de différents types complexes assis dans de multiples wsdl. Ce n'est pas une bonne abstraction de la conception.
Prêt de Référence de la Documentation de Microsoft pour sharetypes
Tourne sur le type de fonction de partage. Cette fonction crée un fichier de code avec un seul type de définition pour les mêmes types partagé entre les différents services (espace de noms, le nom et le fil de la signature doivent être identiques). De référence de services avec http://Url paramètres de ligne de commande ou créer un discomap document pour les fichiers locaux.
Mais il n'y a pas "les différents types complexes assis dans de multiples wsdl". Il y a juste un service web ayant de multiples méthodes retournant même type. Tous définis dans un seul fichier WSDL. Ainsi, /sharetypes ne va pas aider, il ne peut être utilisée).
OriginalL'auteur