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