Я весь день боролся с SvcUtil, пытаясь заставить его генерировать полезный код для некоторых служб IMS Enterprise Services (в первую очередь, для службы группового управления, но есть и другие, для которых мы нуждаемся в этом). Вы можете найти IMS WSDL здесь http://www.imsglobal.org/es/index.html.
Я пришел к выводу, что SvcUtil является бесполезной запоздалой мыслью Microsoft, которая не поддерживает стандарты WSDL и XSD даже наполовину. Он неспособен генерировать службу WCF, которая соответствует стандартным контрактам WSDL, которые IMS использует и функции в одно и то же время. Несмотря на создание компилируемого кода из следующего WSDL (http://www.imsglobal.org/services/gms/wsdl/imsGroupManServiceSync_v1p0.wsdl), наблюдая сгенерированный WSDL из службы WCF (? Wsdl,? Wsdl = wsdl0,? xsd = xsd0 и т.д.) показывает, что ни одна из операций не существует, и только часть типов, которые были сгенерированы в коде, фактически распознаются WCF. Если мы ввинчиваем сгенерированный код, мы можем получить что-то подобное (мы используем SoapUI для тестирования), но тогда он больше не соответствует контракту, поэтому он бесполезен для людей, которым действительно нужно называть эти сервисы.
Есть ли альтернативы SvcUtil? (Пожалуйста, не предлагайте встроенный инструмент Visual Studio "Добавить ссылку на службу", который так же бесполезен, поскольку использует тот же самый код, что и SvcUtil.) Нам нужно что-то, что даст нам степень контроля над тем, как код создается из WSDL-контракта, какие файлы заканчиваются в каждой части, в какие пространства имен помещается каждый элемент кода и т.д. Контракт IMS импортирует типы XSD, специфичные для служб, определенных в WSDL, а также XSD, которые являются общими для всех служб IMS. Нам нужно иметь возможность генерировать разные сборки для этих типов и ссылаться на них в сгенерированном коде (подобно тому, как SvcUtil, по-видимому, должен это делать... но, похоже, он не делает то, что говорит, что в его документации говорится, что он на всех.)
Я до сих пор был большим поклонником WCF. Очевидно, это работает, когда вы используете только сервисы .NET/WCF, но каждый раз, когда вы пытаетесь использовать его в кросс-платформенной среде, совместимой со стандартами, все идет на дерьмо.