Подтвердить что ты не робот

/sharedtypes эквивалент для svcutil.exe?

Построение приложения, которое полагается на стороннего поставщика, который имеет очень многословный набор 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-х?)

4b9b3361

Ответ 1

Попробуйте указать все 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

Ответ 2

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

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

Ответ 3

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