Проблемы использования веб-службы Java / AXIS в приложении .Net - PullRequest
4 голосов
/ 20 мая 2009

Мне нужно использовать веб-службу, написанную на Java сторонним разработчиком, созданную с помощью Axis.

Я использую .Net Framework 3.5 SP1 и VS 2008.

Я сделал веб-ссылку, как мы делали в .net 2.0, и указал на wsdl службы.

Он отлично работал с некоторыми методами сервиса, но когда я пытаюсь вызвать метод, который принимает int в качестве параметра, выдается следующее исключение:

JAXRPCTIE01: caught exception while handling request:  
unexpected element type:  
expected={http://schemas.xmlsoap.org/soap/encoding/}int,
actual={http://www.w3.org/2001/XMLSchema}int

Я проверил wsdl, и он определяет пять различных пространств имен схемы XML:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"  
xmlns:tns="urn:servicos/wsdlservicosgmp2"  
xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/"  
xmlns:ns3="urn:servicos/typesservicosgmp2"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
name="servicosgmp2"  
targetNamespace="urn:servicos/wsdlservicosgmp2">

<schema xmlns="http://www.w3.org/2001/XMLSchema"  
xmlns:tns="urn:servicos/typesservicosgmp2"  
xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  
targetNamespace="urn:servicos/typesservicosgmp2"> 

И определение проблемного метода:

<message name="IWsServicosGMP2_buscaConvenio">  
<part name="Integer_1" type="ns2:int" />  
<part name="Integer_2" type="ns2:int" />  
</message>

Кто-нибудь знает, что мне нужно сделать, чтобы решить эту проблему?

Ответы [ 4 ]

1 голос
/ 23 мая 2009

Похоже, что веб-сервис Java / AXIS использует кодировку SOAP (раздел 5). Это возврат, и это очень странно видеть в эти дни.

Где вы взяли веб-сервис? как долго это работает? У вас есть возможность изменить это? ОСЬ или ОСЬ2? Какая версия? Для AXIS1 все, начиная с AXIS v1.1 и далее, должно работать нормально, но я бы посоветовал обновить его до v1.4. Если возможно, перейдите на AXIS2 и используйте v1.4. (Смешно, AXIS и AXIS2 имеют один и тот же номер версии.)

Почему сторона Java хочет использовать кодировку SOAP? Использовала ли сторона Java WSDL сначала подход, или это одна из тех динамически генерируемых WSDL? AXIS и .NET отлично работают вместе , если вы сначала начнете с WSDL + XSD , и ограничитесь веб-сервисами doc / lit и ограничите использование xmlschema менее экзотическими частями: примитивы, а структуры и массивы одинаковы. Вы можете вкладывать на любой уровень: массивы структур, содержащих массивы, структуры, содержащие массивы структур и т. Д. И т. Д.

Приложение : Если вы начнете с вашей объектной модели Java и попытаетесь динамически сгенерировать проводной интерфейс из нее (например, WSDL), у вас будет намного хуже взаимодействие, и вы будете думать с точки зрения отправки объектов по проводам вместо сообщений, что может быть вредным.

Чего следует избегать: списки, ограничения, группы замещения и другие дурацкие вещи.

0 голосов
/ 01 апреля 2010

Я также занимаюсь вопросами ОСи и нашел некоторые решения.

Я интегрировался с ITIM 5.0 с помощью неподдерживаемых веб-служб, использующих AXIS 1.3. Все проблемы, с которыми я столкнулся, были исправлены в версии 1.4, и, учитывая, что продукту более 5 лет, я не понимаю, почему они выбрали старую версию. Я обнаружил несколько проблем, помимо хорошо опубликованной, о том, как AXIS представляет массивы, указывая на централизованное хранилище значений. Одним из таких вопросов является пространство имен. AXIS имеет тенденцию генерировать WSDL с пространством имен, но возвращаемые значения не имеют пространства имен, .NET просто не может найти значение во время десериализации. Мне понадобилось вечно, чтобы выяснить, почему, но я решил это, вручную удалив требование пространства имен из прокси-кода. Вторая проблема, с которой я столкнулся, заключалась в том, как WSDL представляет коллекции элементов. Коллекция называется SomeCollection с элементами под именем Item. Когда служба возвращается, элементы именуются так же, как коллекция (SomeCollection содержит SomeCollection (s)). Мне пришлось вручную переименовать все эти ссылки в прокси, чтобы они совпадали с коллекцией. Это стоило мне бесчисленных часов. Если я найду больше, я опубликую их здесь. Очевидно, что решение заключается в обновлении до версии 1.4, но IBM не поддержит его или не перевернет исходный код для этого.

Подробнее читайте в моем блоге.

http://nbaked.wordpress.com/2010/04/01/issues-integrating-axis-web-services-with-net/

0 голосов
/ 20 мая 2009

Я не уверен, поможет ли это, но стоит попробовать. Вы пытались добавить ссылку на службу (оболочка svcutil.exe) вместо веб-ссылки (оболочка wsdl.exe)?

0 голосов
/ 20 мая 2009

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

Я немного читал, и похоже, что Axis не всегда хорошо работает с .NET.

...