2010-03-02 10 views
17

Construire une application qui dépend d'un fournisseur tiers qui a un ensemble très verbeux de services SOAP (nous parlons de plus de 50 fichiers WSDL). Chaque WSDL individuel a cependant de nombreuses déclarations de type partagées. Lors de la génération du code client avec wsdl.exe, il y avait un indicateur/sharedtypes qui fusionnerait les entrées dupliquées si un type avait été trouvé plusieurs fois. Lorsque je tente de générer mon code client, je bombarde sur ces types de chevauchement que le 3ème partie inclut dans tous leurs fichiers WSDL./sharedtypes équivalent pour svcutil.exe?

svcutil /t:code /importxmltypes [mypath]/*.wsdl 

Résultats dans les messages d'erreur faisant allusion aux collisions de type. Par exemple, un couple d'échantillons des messages d'erreur ci-dessous:

Error: There was an error verifying some XML Schemas generated during export: 
The simpleType 'http://common.soap.3rdparty.com:CurrencyNotation' has already been 
declared. 

Error: There was an error verifying some XML Schemas generated during export: 
The complexType 'http://common.soap.3rdparty.com:NumberFormat' has already been 
declared. 

Je n'ai pas le contrôle de la sortie des fichiers WSDL. Je ne veux pas avoir à éditer les WSDL à la main par crainte d'une erreur qui se brise d'une manière à l'exécution, ce qui serait très difficile à retrouver dans notre édition des fichiers WSDL. Sans oublier qu'il y a 50 fichiers WSDL qui vont de 200 à 1200 lignes de XML. (Rappelle-moi pourquoi nous nous pensions que SOAP était le grand salut à tous dans les années 90 en retard?)

Répondre

2

essayez de spécifier tous les fichiers WSDL dans une commande:

svcutil http://example.com/service1?wsdl http://example.com/service2?wsdl ... 

Cela devrait prendre en charge automatiquement des types en double . Une autre option consiste à jeter un oeil à l'interrupteur de commande /reference:

/reference:<file path>  - Add the specified assembly to the set of 
           assemblies used for resolving type 
           references. If you are exporting or 
           validating a service that uses 3rd-party 
           extensions (Behaviors, Bindings and 
           BindingElements) registered in config use 
           this option to locate extension assemblies 
           that are not in the GAC. (Short Form: /r) 

Cela signifie que si vous avez déjà certains types définis dans certains assemblage, vous pouvez inclure cette assemblée et svcutil exclurez types de celui-ci pour éviter les doublons:

svcutil /reference:someassembly.dll http://example.com/service?wsdl 
+1

Tous les wsdls sont locaux, mais ce n'est pas le cas. Mon problème n'est pas que je ne suis pas capable de passer plusieurs fichiers .wsdl. Le problème est que la source a inclus plusieurs types de données dans chaque fichier wsdl (ou plusieurs, sinon tous). Par exemple, en parcourant, des 6 premiers wsdls que j'ai ouverts, il apparaît que 5 ont une entrée ComplexElement pour un type appelé CurrencyNotation. Quand svcutil essaye d'analyser tous mes wsdls, il dit, oh hé, currencyNotation existe déjà, SO SORRY. BOOM. – bakasan

+0

Donc, vous dites que taper individuellement chaque chemin wsdl se comportera différemment que d'aller * .wsdl (tous les wsdls résident localement). Comme il s'agit de la première génération de nos proxies, je n'ai vraiment pas d'assembly à référencer. Une stratégie consisterait-elle à analyser un wsdl, à le compiler en dll, puis à le référencer pour le suivant? Résolvez les dupes, puis rincez et répétez pour le reste? – bakasan

+2

Était pas tout à fait prêt à taper les chemins d'accès à tous les fichiers wsdl 50+, mais le test w/seulement deux, svcutil foo.wsdl bar.wsdl bombardé w/le même type de messages en double. Après avoir traité w/douleurs de wsdl.exe il ya des années, il n'est pas très réconfortant de voir que svcutil.exe dans ce jour et l'âge ne semble pas beaucoup mieux. : P – bakasan

0

J'avais des problèmes similaires. En définissant différents espaces de noms CLR pour les différents espaces de noms XML (en utilisant l'argument/namespace de svcutil), j'ai pu le faire fonctionner.

/namespace:http://www.opengis.net/gml,OpenGIS.GML 
0

J'utilise wsdl.exe pour contourner parce que je travaille avec des webservices SOAP qui définissent les mêmes objets de transfert de données à différents critères d'évaluation. J'utilise donc wsdl.exe car il possède le commutateur sharetypes. Je ne suis pas un développeur WPF donc je ne m'inquiète pas du fait que la sortie n'implémente pas IWhatever pour WPF, mais les classes générées sont toutes partielles donc vous pouvez travailler pour implémenter les interfaces qui vous intéressent dans un fichier séparé.