【问题标题】:Problems consuming a Java/AXIS web service in a .Net Application在 .Net 应用程序中使用 Java/AXIS Web 服务的问题
【发布时间】:2009-05-20 17:03:08
【问题描述】:

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

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

我创建了一个 Web 引用,就像我们在 .net 2.0 中所做的那样,并将其指向服务的 wsdl

它与服务的某些方法完美配合,但是当我尝试调用以 int 作为参数的 Method 时,会引发以下异常:

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 使用无符号整数(据我记得)有关。

标签: java .net web-services interop wsdl


【解决方案1】:

Java/AXIS Web 服务似乎正在使用 SOAP(第 5 节)编码。这是一个倒退,这些天很奇怪。

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

为什么Java端要使用SOAP编码? Java 方面是否采用了WSDL first 方法,或者这是动态生成的 WSDL 方法之一? AXIS and .NET work together just fine,如果您从 WSDL+XSD first 开始,并且将自己限制在 doc/lit webservices 并将您对 xmlschema 的使用限制在不那么奇特的部分:原语、结构和相同的数组。您可以嵌套到任何级别:包含数组的结构数组、包含结构数组的结构等。

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

要避免的事情:列表、限制、替换组和其他古怪的事情。

【讨论】:

  • 嗨 Cheeso,我从第三方公司获得了这个 WebService。他们刚刚为我们正在制作的集成解决方案开发了它。嗯,谢谢你的回答,我会让他们知道你所说的一切。我猜他们采用了动态生成的 WSDL 方法。这可能是我们问题的根源。再次感谢。
  • 是的,如果他们想要互操作,那么 WSDL-first 是正确的选择。网上有很多关于如何做到这一点的好资源。
  • 奶酪,谢谢。我不确定他们采取的方法是什么,但在我与他们讨论过你告诉我的事情之后,他们对服务进行了一些更改,现在它正在按预期工作。再次感谢。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我会试试看,如果成功了会通知你的。
  • 实际上听起来像是在 .NET 端生成代理类的任何问题(假设 WSDL 具有正确的命名空间)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 不要只发布链接,否则如果链接断开,您的答案将毫无价值
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多