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", прокси откроется, однако...

  1. Я не могу вызвать операцию, потому что служба не распознает "getData1"
  2. Служба имеет почти 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, все же работает.

Другие вопросы по тегам