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