2010-03-02 11 views
17

Erstellen einer App, die auf einen Drittanbieter angewiesen ist, der über sehr umfangreiche SOAP-Dienste verfügt (wir sprechen über 50 WSDL-Dateien). Jede einzelne WSDL hat jedoch zahlreiche gemeinsame Typdeklarationen. Beim Generieren von Client-Code mit wsdl.exe gab es ein/sharedtypes-Flag, das doppelte Einträge zusammenführen würde, wenn ein Typ mehrmals gefunden wurde./sharedtypes gleichwertig für svcutil.exe?

Wenn ich versuche, meinen Clientcode zu generieren, bombardiere ich diese überlappenden Typen, die der Drittanbieter in allen WSDL-Dateien enthält.

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

Ergebnisse in Fehlermeldungen, die auf die Kollisionen des Typs hinweisen. Zum Beispiel ein paar Proben der Fehlermeldungen unter:

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. 

Ich habe keine Kontrolle über die Ausgabe der WSDLs. Ich möchte die WSDLs nicht manuell bearbeiten müssen, aus Angst vor einem Fehler, der zur Laufzeit in eine Art und Weise bricht, die nur schwer zu unserer Bearbeitung der WSDL-Dateien zurückverfolgt werden kann. Nicht zu vergessen, dass es 50 WSDL-Dateien gibt, die von 200-1200 XML-Zeilen reichen. (Erinnere mich wieder, warum wir SOAP gedacht war, die große Rettung für uns alle zurück in den späten 90er Jahren?)

Antwort

2

versuchen, alle WSDLs in einem Befehl spezifiziert wird:

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

Dies sollte automatisch kümmern doppelte Typen . Eine weitere Möglichkeit ist es, einen Blick auf die /reference Befehlsschalter zu nehmen:

/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) 

Das bedeutet, dass, wenn Sie bereits einige Typen in irgendeiner Baugruppe definiert haben, können Sie diese Baugruppe enthalten und svcutil wird Typen ausschließen es um Duplikate zu vermeiden:

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

Alle WSDLs sind lokal, aber das ist nebensächlich. Mein Problem ist nicht, dass ich mehrere WSDL-Dateien nicht weitergeben kann. Das Problem besteht darin, dass die Quelle mehrere Datentypen in jeder einzelnen WSDL-Datei (oder mehreren, wenn nicht allen) enthalten hat. Wenn ich zum Beispiel die ersten 6 Wsdls, die ich geöffnet habe, durchgeblende, erscheint 5 ein ComplexElement-Eintrag für einen Typ namens CurrencyNotation. Wenn SVCUTIL versucht, alle meine WSDLs zu parsen, heißt es, oh hey, Währung existiert bereits, SO SORRY. BOOM. – bakasan

+0

Sie sagen also, dass das individuelle Eintippen jedes wsdl-Pfades sich anders als das Gehen von * .wsdl (alle wsdls befinden sich lokal) verhält. Da dies die erste Generation unserer Proxies ist, habe ich wirklich keine Assembly, in der referenziert werden kann. Wäre eine Strategie, ein WSDL zu analysieren, zu einer DLL zu kompilieren und dann für das nächste zu referenzieren? DUPES LÖSEN, dann spülen und für den Rest wiederholen? – bakasan

+2

War nicht ganz bereit, die Pfade zu allen 50+ WSDL-Dateien zu tippen, aber testen w/nur zwei, svcutil foo.wsdl bar.wsdl zerbombt mit der gleichen doppelten Typen Nachricht. Nachdem ich vor Jahren mit wsdl.exe gequält habe, ist es nicht sehr beruhigend zu sehen, dass svcutil.exe heutzutage nicht viel besser aussieht. : P – bakasan

0

Ich hatte ähnliche Probleme. Durch die Definition verschiedener CLR-Namespaces für die verschiedenen XML-Namespaces (mit dem/namespace-Argument von svcutil) konnte ich es zum Laufen bringen.

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

Ich habe wsdl.exe benutze diese Runde zu bekommen, weil ich mit einigen SOAP Webservices arbeiten, die die gleichen Datentransferobjekte an verschiedenen Endpunkten definieren. Also verwende ich wsdl.exe, weil es den sharetypes Schalter hat. Ich bin kein WPF-Entwickler, also ist es mir egal, dass die Ausgabe IWwhatever für WPF nicht implementiert, aber die generierten Klassen sind alle partiell, so dass Sie einige Arbeiten ausführen können, um Schnittstellen, die Ihnen wichtig sind, in einer separaten Datei zu implementieren.