在.Net应用程序中使用Java / AXIS Web服务时出现的问题

时间:2009-05-20 17:03:09

标签: java .net web-services interop wsdl

我必须使用由第三方用Java编写的Web服务,我想用Axis生成。

我正在使用.Net Framework 3.5 SP1和VS 2008。

我制作了一个Web引用,就像我们以前在.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 Schema命名空间:

<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 个答案:

答案 0 :(得分:1)

似乎Java / AXIS Web服务正在使用SOAP(第5节)编码。这是一个回归,这些日子看起来很奇怪。

你在哪里获得网络服务?它运行了多长时间?你有能力改变它吗? AXIS还是AXIS2?什么版本?对于AXIS1,AXIS v1.1以后的任何内容都可以正常工作,但我建议更新到v1.4。如果可能,请移至AXIS2,并使用v1.4。 (令人困惑的是,AXIS和AXIS2的版本号相同。)

为什么Java方想要使用SOAP编码? Java方面是采用 WSDL第一个 方法,还是这些动态生成的WSDL之一? AXIS and .NET work together just fine,如果你从WSDL+XSD first开始,并将自己局限于doc / lit网络服务,并将xmlschema的使用局限于不那么奇特的部分:原语,结构和数组。您可以嵌套到任何级别:包含数组的结构数组,包含结构数组的结构等等。

附录:如果你从Java对象模型开始,并尝试从它动态生成一个有线接口(例如,WSDL),你往往会得到更糟糕的互操作,你倾向于考虑通过线路发送对象而不是消息,这可能是有害的。

要避免的事项:列表,限制,替换组和其他古怪的东西。

答案 1 :(得分:0)

我正在处理AXIS问题,并找到了一些解决方案。

我使用不支持的使用AXIS 1.3的Web服务与ITIM 5.0集成。我所遇到的所有问题都在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/

答案 2 :(得分:0)

您需要进入.NET生成的代理类,并手动将输入参数的命名空间更改为Axis代码使用的命名空间。希望这会奏效。

我一直在做一些阅读,似乎Axis并不总能与.NET一起使用。

答案 3 :(得分:0)

我不确定这是否会有所帮助,但值得一试。您是否尝试过添加服务引用(svcutil.exe包装器)而不是Web引用(wsdl.exe包装器)?