繁体   English   中英

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

[英]Problems consuming a Java/AXIS web service in a .Net Application

我必须使用由第三方用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>

任何人都知道我必须做些什么才能解决这个问题?

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

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

为什么Java方想要使用SOAP编码? Java方面是采用WSDL第一种方法,还是这种动态生成的WSDL方法之一? 如果您首先使用WSDL + XSDAXIS和.NET可以很好地协同工作 ,并将自己局限于doc / litweser服务,并将xmlschema的使用局限于不那么奇特的部分:原语,结构和数组。 您可以嵌套到任何级别:包含数组的结构数组,包含结构数组的结构等。

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

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

我正在处理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/

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM