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