2010-03-02 11 views
17

Budowanie aplikacji opartej na dostawcy zewnętrznym, który ma bardzo obszerny zestaw usług SOAP (mówimy o plikach WSDL 50+). Każdy pojedynczy WSDL ma jednak wiele deklaracji współdzielonego typu. Podczas generowania kodu klienta za pomocą pliku wsdl.exe używana była flaga/sharedtypes, która łączyłaby duplikaty wpisów, jeśli typ został znaleziony kilka razy./sharedtites odpowiednik dla svcutil.exe?

Kiedy próbuję wygenerować kod klienta, zbombarduję te nakładające się typy, które trzecia strona zawiera we wszystkich plikach WSDL.

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

Wyniki w komunikatach o błędach odnoszących się do kolizji typu. Na przykład kilka próbek komunikatów o błędach poniżej:

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. 

Nie mam kontroli nad wyjściami WSDL. Nie chcę edytować plików WSDL ręcznie z obawy przed błędem, który łamie się w sposób runtime, który byłby bardzo trudny do śledzenia z powrotem do edycji plików WSDL. Nie wspominając o tym, że istnieje 50 plików WSDL, które wahają się od 200-1200 linii XML. (Przypomnij mi jeszcze raz dlaczego myśleliśmy SOAP było wielkie zbawienie nas wszystkich z powrotem w latach 90.?)

Odpowiedz

2

Spróbuj określający wszystkie WSDLs w jednym poleceniem:

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

ten powinien automatycznie dbać o zduplikowanych typów . Inną opcją jest spojrzeć na przełączniku poleceń /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) 

Oznacza to, że jeśli masz już pewne typy zdefiniowane w jakimś zespole może zawierać ten zespół i svcutil wykluczy typy od niego, aby uniknąć duplikatów:

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

Wszystkie wsdls są lokalne, ale nie ma to znaczenia. Moim problemem nie jest to, że nie jestem w stanie przekazać kilku plików .wsdl. Problem polega na tym, że źródło zawiera wiele typów danych w każdym pliku wsdl (lub kilku, jeśli nie wszystkich). Na przykład przeglądając pierwsze 6 nowo utworzonych wsdli, wydaje się, że 5 zawiera wpis ComplexElement dla typu o nazwie CurrencyNotation. Kiedy svcutil próbuje przeanalizować wszystkie moje wsdls, mówi, oh hej, currencyNotation już istnieje, SO SORRY. BUM. – bakasan

+0

Tak więc mówisz, że samodzielne wpisywanie poszczególnych ścieżek wsdl będzie się zachowywać inaczej niż przejście * .wsdl (wszystkie wsdls znajdują się lokalnie). Ponieważ jest to pierwsza generacja naszych serwerów proxy, naprawdę nie mam zespołu, do którego można by się odnieść. Czy strategia ma przeanalizować jeden plik wsdl, skompilować do biblioteki DLL, a następnie odnieść do następnego? Rozwiąż dupes, a następnie spłucz i powtórz dla reszty? – bakasan

+2

Nie był jeszcze gotowy do wypisania ścieżek do wszystkich 50 plików wsdl, ale testowanie w/tylko dwóch, svcutil foo.wsdl bar.wsdl zostało zbombardowane w/ten sam typ duplikatów wiadomości. Po rozpatrzeniu w/bóle od wsdl.exe lata temu, nie jest to zbyt pocieszające, aby zobaczyć, że svcutil.exe w tym dniu i wieku nie wydaje się dużo lepiej. : P – bakasan

0

Miałem podobne problemy. Definiując różne przestrzenie nazw CLR dla różnych przestrzeni nazw xml (używając argumentu/namespace svcutil), udało mi się go uruchomić.

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

Używam wsdl.exe obejść to, ponieważ pracuję z niektórych webservices SOAP, które określają te same obiekty transferu danych w różnych punktach końcowych. Używam więc wsdl.exe, ponieważ ma on przełącznik sharetypes. Nie jestem programistą WPF, więc nie obchodzi mnie to, że dane wyjściowe nie implementują IWhatever dla WPF, ale wygenerowane klasy są częściowe, więc możesz zrobić trochę pracy, aby zaimplementować interfejsy, którymi się interesujesz w osobnym pliku.