WCF: Svcutil генерирует недопустимый клиентский прокси, веб-сервис Apache AXIS, операции перегрузки - PullRequest
4 голосов
/ 28 апреля 2009

Я использую сторонний веб-сервис, написанный на 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 имеет недопустимое имя тела получить данные. Должно быть getData1

Если я изменю WrapperName = "getData1", прокси откроется, однако ...

  1. Я не могу вызвать операцию, потому что служба не распознает "getData1"
  2. Сервис имеет почти 1100 операций, из которых почти половина - перегрузки

Есть ли способ сгенерировать и / или изменить прокси, чтобы все операции работали с WCF?

Mark

Ответы [ 6 ]

4 голосов
/ 16 февраля 2013

Что бы это ни стоило (спустя 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 отображается в пользовательском интерфейсе как " Добавить веб-ссылку ", поэтому непосредственное выполнение wsdl.exe не является необходимо.

2 голосов
/ 31 июля 2009

Единственный обходной путь, который мне удалось найти, - это отредактировать сгенерированный код вручную и удалить все ненужные перегрузки.

1 голос
/ 31 июля 2009

Я не видел этот вопрос раньше, потому что у вас был тег "java", и я игнорирую вопросы Java. Ваш вопрос не был о Java, поэтому не должно быть тега "java".

svcutil не переименовывает перегруженные операции. Это потому, что нет такой вещи, как перегруженные операции. WSDL не имеет понятия двух операций с одним и тем же именем, но с использованием разных сообщений.

Если вы посмотрите на WSDL от Axis, я думаю, вы обнаружите, что к операциям добавлены номера.


Исправление: В комментарии Mark Good правильно указывает, что WSDL 1.1 допускает перегрузку. Мне кажется, что это имеет смысл только в контексте службы на основе RPC, где имя сообщения может использоваться для различения одной перегрузки и другой.

Однако он может не знать, что перегрузка оператора запрещена Базовый профиль WS-I 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 - хорошая идея.

0 голосов
/ 06 мая 2015

Ни одно из решений здесь не помогло мне.

Создание ссылки в проекте vs2010, нацеленного на .NET2, и последующее открытие решения в vs2012 или vs2013 с таргетингом на .NET4, все же работает.

0 голосов
/ 05 апреля 2013

Я обнаружил, что при использовании «старомодного» * ​​1001 * он корректно генерирует классы с перегрузками даже в VS2012.

0 голосов
/ 28 апреля 2009

Напишите скрипт, который сделает это текстовое исправление, и установите его как скрипт пост-сборки для вашей прокси-библиотеки.

...