WCF: Svcutil генерирует недопустимый клиентский прокси, веб-сервис Apache AXIS, операции перегрузки
Я использую сторонний веб-сервис, написанный на Java, и использую Apache Axis 1.3. Служба имеет много операций перегрузки. Когда WCF Svcutil генерирует прокси, он переименовывает перегруженную операцию, добавляя число после имени операции. Например:
getDataResponse getData(getDataRequest request);
getDataResponse1 getData1(getDataRequest1 request);
Само по себе это не проблема, но когда Svcutil генерирует сообщения запроса / ответа, он игнорирует изменение свойства WrapperName в MessageContracts.
[MessageContractAttribute(
WrapperName = "getData",
WrapperNamespace = "http://namespace.com",
IsWrapped = true)]
public partial class getDataRequest1 { .. }
Когда клиентское приложение пытается открыть прокси, выдается следующее исключение:
InvalidOperationException: RPC-сообщение getDataRequest1 в операции getData1 имеет недопустимое имя тела getData. Должно быть getData1
Если я изменю WrapperName = "getData1", прокси откроется, однако...
- Я не могу вызвать операцию, потому что служба не распознает "getData1"
- Служба имеет почти 1100 операций, из которых почти половина перегрузок
Есть ли способ генерировать и / или модифицировать прокси, чтобы все операции работали с WCF?
отметка
6 ответов
Единственный обходной путь, который мне удалось найти, - это отредактировать сгенерированный код вручную и удалить все перегрузки, которые мне не нужны.
Для чего это стоит (4 года спустя), кажется, что позвонив WSDL.exe
вручную и передавая /protocol:SOAP
Параметр, этой проблемы можно избежать. Генерирование сервисного клиента через пользовательский интерфейс по-прежнему вызывает эту проблему с VS2012 для сервисов, сгенерированных Apache Axis.
Пример использования:
c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools>wsdl /l:cs /protocol:SOAP http://rxnav.nlm.nih.gov/RxNormDBService.xml /out:c:\drop\rxnavapi.cs
Изменить: Sphinxxx правильно отметил, что параметр протокола SOAP Sphinxxx в пользовательском интерфейсе как " Добавить веб-ссылку ", поэтому выполнение wsdl.exe
напрямую не надо.
Я не видел этот вопрос раньше, потому что у вас был тег "java", и я игнорирую вопросы Java. Ваш вопрос был не о Java, поэтому не должно быть тега "Java".
svcutil не переименовывает перегруженные операции. Это потому, что нет такой вещи, как перегруженные операции. WSDL не имеет понятия двух операций с одним и тем же именем, но с использованием разных сообщений.
Если вы посмотрите на WSDL от Axis, я думаю, вы обнаружите, что к операциям добавлены номера.
Исправление: В комментарии Mark Good правильно указывает, что WSDL 1.1 допускает перегрузку. Мне кажется, что это имеет смысл только в контексте службы на основе RPC, где имя сообщения может использоваться для различения одной перегрузки и другой.
Однако он может не знать, что перегрузка оператора запрещена WS-I Basic Profile 1.1:
4.5.3 Отличительные операции
Перегрузка имени операции в wsdl:portType
профиль запрещен.
R2304 A wsdl:portType
в ОПИСАНИИ ДОЛЖНЫ иметь операции с различными значениями для их атрибутов имени.
Обратите внимание, что это требование относится только к wsdl:operations
в пределах данного wsdl:portType
, wsdl:portType
можно иметь wsdl:operations
с именами, которые совпадают с именами, найденными в других wsdl:portTypes
,
Если вы прочитаете больше о WS-I BP1.1, вы поймете, почему не все в WSDL 1.1 - хорошая идея.
Я обнаружил, что при использовании "старомодный" AddServiceReference
, он правильно генерирует классы с перегрузками, даже в VS2012.
Напишите сценарий, который исправит текст, и установите его как сценарий после сборки для вашей прокси-библиотеки.
Ни одно из решений здесь не сработало для меня.
Генерация ссылки в проекте vs2010, нацеленного на.NET2, а затем открытие решения в vs2012 или vs2013 для.NET4, все же работает.