从.NET调用Java / AXIS Web服务:’return null’问题

我一直在通过所有谷歌,stackoverflow等寻求这个问题。 我找到了很多相关的答案,但不是一个真正的解决方案。

我正在从.NET客户端使用Axis服务,但返回始终为null,无论我发送什么参数,始终为null。

所以我开始看,我试图从SOAPUI中使用它,它工作!

所以我的第一个想法是,.NET做错了,我搜索和搜索,我发现命名空间存在一些问题。

相关文章在这里

所以在此之后,我尝试通过服务引用,Web引用使用服务,使用WSDL.EXE创建代理(它创建得非常好!)并查找所有命名空间,但是所有的lokked很好..我做了一些更改它到命名空间但没有。

然后我发现不仅名称空间是问题,也是数组; 实际上服务返回这样的东西。

    0036887  00110 00110  000270 NOMBRE PENDIENTE  2011-02-15 2011-02-15 2012-02-15 03 CARLOS ZARATE JIMENEZ ZAJC720213K98 0449626251463 1 003 237.84 237.84 951.36  .00   0036887 0000000     CARLOS ZARATE JIMENEZ          1972-02-13 1 1 0    00150  SEGURO DE MUERTE ACCIDENTAL 250,000 .00 820.00 039   250,000 .00   00150  SEGURO DE MUERTE ACCIDENTAL 250,000 .00 95.00 039   250,000 .00   00150  SEGURO DE MUERTE ACCIDENTAL 500 .00 36.36 039   500 .00         5183648 2011-02-15 2011-02-26 2011-02-26 00 GENERADO 000000275.89 .00 .00 2011-02-15 2011-05-15      5183649 2011-02-15 2011-02-15 1900-00-00 00 GENERADO 000000275.89 .00 .00 2011-05-15 2011-08-15      5183650 2011-02-15 2011-02-15 1900-00-00 00 GENERADO 000000275.89 .00 .00 2011-08-15 2011-11-15      5183651 2011-02-15 2011-02-15 1900-00-00 00 GENERADO 000000275.89 .00 .00 2011-11-15 2012-02-15            

(我从SOAPUI得到了这个例子)。

相关的post在这里

我也尝试了这个 。

从这里得到另一个可能的麻烦,列出了一个名为“item”的数组项,正如你在上面提到的WebServiceResponse中看到的那样,它们就是这样列出的。 所以在我看来,这一切都是来自c#的反序列化问题。 看着我找到了所有这一切的半解决方案。

实际情况是,实际上.NET得到的响应非常好,所有它都具有反序列化步骤的问题,可能是上面提到的所有可能的原因(多个名称空间,数组,名为“item”的数组项)。

http://www.codeproject.com/KB/webservices/Java_WS_NET.aspx

我在我的代理中覆盖了这样的方法:

 protected override System.Net.WebResponse GetWebResponse(System.Net.WebRequest request) { WebResponse wr = base.GetWebResponse(request); StreamReader sr = new StreamReader(wr.GetResponseStream()); //throw new Exception(sr.ReadToEnd()); return wr ; } 

我抛出exception,看看服务的结果是否被捕获,实际上是在那里!

所以在所有操作系统之后,我不知道是否有修复,服务包,有人找到了解决方案或任何我可以正确理解WebResponse的方法。 或者如何正确使用该轴服务,我认为最好的方法就是正确地序列化响应覆盖方法,因为它看起来像是一个.NET的bug,我认为它有麻烦因为所有数组都有一个“项目“ 在上面。

提前感谢阅读这篇文章。

我真的很赞赏任何帮助!

再次感谢!。

最后我解决了这个问题,我的一个朋友帮助了我,显然WSDL和名称空间存在问题。 C#生成的代理错误。 不知道是ac问题还是轴问题。 但希望这个答案可以帮助其他人。 查看WebService方法的所有命名空间。 C#生成了这样的方法。

 ///  [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.openuri.org/InformacionPoliza", RequestNamespace = "http://www.openuri.org/", ResponseNamespace = "http://www.openuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [return: System.Xml.Serialization.XmlElementAttribute("Poliza")] public Poliza InformacionPoliza(CriteriosPoliza CriteriosPoliza) { object[] results = this.Invoke("InformacionPoliza", new object[] { CriteriosPoliza}); return ((Poliza)(results[0])); } 

但是在WSDL中有这样的东西..

                 ****     

看一下它指的是tns2名称空间,它说的是xmlns:tns2="http://www.example.org/PolizasBanorteSchema"

所以.NET生成的代理是错误的,它必须是这样的

 ///  [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.openuri.org/InformacionPoliza", RequestNamespace = "http://www.openuri.org/", ResponseNamespace = "http://www.openuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [return: System.Xml.Serialization.XmlElementAttribute("Poliza", Namespace = "http://www.example.org/PolizasBanorteSchema")] public Poliza InformacionPoliza(CriteriosPoliza CriteriosPoliza) { object[] results = this.Invoke("InformacionPoliza", new object[] { CriteriosPoliza}); return ((Poliza)(results[0])); } 

命名空间真的很神奇,

  [return: System.Xml.Serialization.XmlElementAttribute("Poliza", Namespace = "http://www.example.org/PolizasBanorteSchema")] 

改变了那行代码,一切都像魅力一样工作所以,在轴服务中使用数组和不同的命名空间时要小心,你可能在生成ac#client时遇到一些问题。

这篇文章是对的:)