Альтернатива SvcUtil.exe?

Я весь день боролся с 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, но каждый раз, когда вы пытаетесь использовать его в кросс-платформенной среде, совместимой со стандартами, все идет на дерьмо.

Ответы

Ответ 1

Извините, что у меня нет времени полностью ответить на это, но есть ответ на ваш вопрос. Существует интерфейс, который вы можете реализовать под названием IWsdlImportExtension, который имеет два метода, которые вас будут интересовать:

GenerateContract() и GenerateOperation()

Если вы реализуете эти методы, вы можете фактически управлять тем, как SvcUtil выкачивает код, добавляя или удаляя CustomAttributes и так далее. Вам необходимо скомпилировать DLL с интерфейсом, а затем указать конфигурацию SvcUtil в DLL и интерфейсе.

Используя этот метод, вы можете, например, добавить документацию Xml к выданным прокси и т.д. Об этом есть несколько интересных статей.

Ответ 2

Вы посмотрели генератор прокси WCF на Codeplex? Основываясь на том, кто стоит за ним (Кейт Грегори и Микеле Леру Бустаманте), надеемся, что это будет полезно - плюс вы получите источники, чтобы вы могли адаптироваться/настроить в своем сердечном содержимом!

(у меня не было времени серьезно взглянуть на него - но это - на бесконечном "To-Do, когда я приеду" ).

Плюс проверить этот сообщение в блоге от Pedram Rezaei, в котором показано, как влиять на Visual Studio "Добавить ссылку на службу" с вашим собственным кодом.