/ sharedtypes эквивалент для svcutil.exe? - PullRequest
17 голосов
/ 02 марта 2010

Создание приложения, основанного на стороннем поставщике, имеющем очень подробный набор служб SOAP (мы говорим о 50+ файлах WSDL). Однако каждый отдельный WSDL имеет множество общих объявлений типов. При создании клиентского кода с помощью wsdl.exe использовался флаг / sharedtypes, который объединял бы дублирующиеся записи, если тип был найден несколько раз.

Когда я пытаюсь сгенерировать свой клиентский код, я бомбардирую эти перекрывающиеся типы, которые сторонняя организация включает во все свои файлы WSDL.

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

В результате появляются сообщения об ошибках со ссылкой на коллизии типов. Например, пара примеров сообщений об ошибках ниже:

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.

У меня нет контроля над выводом WSDL. Я не хочу редактировать WSDL вручную из-за боязни ошибки, которая ломается во время выполнения, и было бы очень трудно отследить наше редактирование файлов WSDL. Не говоря уже о том, что существует 50 файлов WSDL с диапазоном 200-1200 строк XML. (Напомните мне еще раз, почему мы думали, что SOAP был великим спасением для всех нас в конце 90-х?)

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Попробуйте указать все WSDL в одной команде:

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

Это должно автоматически позаботиться о дубликатах типов. Другой вариант - взглянуть на командный переключатель /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)

Это означает, что если у вас уже есть некоторые типы, определенные в некоторой сборке, вы можете включить эту сборку и svcutil исключит из нее типы, чтобы избежать дублирования:

svcutil /reference:someassembly.dll http://example.com/service?wsdl
0 голосов
/ 01 мая 2012

Я использовал wsdl.exe, чтобы обойти это, потому что я работаю с некоторыми веб-сервисами SOAP, которые определяют одни и те же объекты передачи данных на разных конечных точках.Поэтому я использую wsdl.exe, потому что он имеет переключатель sharetypes.Я не разработчик WPF, поэтому мне все равно, что вывод не реализует IWh независимо от WPF, но все сгенерированные классы являются частичными, так что вы можете проделать некоторую работу по реализации интерфейсов, которые вам нужны, в отдельном файле.*

0 голосов
/ 19 сентября 2010

У меня были похожие проблемы. Определив разные пространства имен CLR для разных пространств имен xml (используя аргумент / namespace в svcutil), я смог заставить его работать.

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