使用复杂类型返回的c# . net应用程序消费Java Web服务
本文关键字:应用程序 Java 服务 Web net 复杂 类型 返回 | 更新日期: 2023-09-27 18:18:06
我遇到了这个问题:
我开发了一个在Java EE应用程序中公开的WS,这是wsdl:types定义
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://endpoint.ws.solution.client.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://model.ws.solution.client.com"/>
<element name="invoke">
<complexType>
<sequence>
<element name="cbte_modo" type="xsd:string"/>
<element name="cuit_emisor" type="xsd:string"/>
<element name="pto_vta" type="xsd:int"/>
<element name="cbte_tipo" type="xsd:int"/>
<element name="cbte_nro" type="xsd:int"/>
<element name="cbte_fch" type="xsd:string"/>
<element name="imp_total" type="xsd:double"/>
<element name="cod_autorizacion" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="invokeResponse">
<complexType>
<sequence>
<element name="invokeReturn" type="tns1:ComprobanteConstatarResponse"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://model.ws.solution.client.com" xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="ComprobanteConstatarResponse">
<sequence>
<element name="code" nillable="true" type="xsd:string"/>
<element name="fch_proceso" nillable="true" type="xsd:string"/>
<element name="msg" nillable="true" type="xsd:string"/>
<element name="resultado" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
这个Web服务只公开了一个名为"Invoke"的方法,这是它的java类中的方法定义:
@WebMethod
public ComprobanteConstatarResponse invoke(String cbte_modo, String cuit_emisor, Integer pto_vta, Integer cbte_tipo,
Integer cbte_nro, String cbte_fch, Double imp_total, String cod_autorizacion){
ComprobanteConstatarRequest request = new ComprobanteConstatarRequest(cbte_modo, cuit_emisor, pto_vta, cbte_tipo, cbte_nro, cbte_fch, imp_total, cod_autorizacion);
ComprobanteConstatarResponse response = this.wsConnectorFacade.validateComprobante(request);
return response;
}
正如你所看到的,响应是一个名为"ComprobanteConstatarResponse"的Java类。
此外,我还开发了一个简单的c#控制台应用程序来测试从。net应用程序调用WS。因此,我添加了许多教程所说的服务引用,并编码了调用:
static void Main(string[] args)
{
ComprobanteConstatarService webService = new ComprobanteConstatarService();
ComprobanteConstatarResponse response = new ComprobanteConstatarResponse();
response = webService.invoke("CAE","20351240181",4001,1,1223,"20140815",100.5,"CAE999999");
Console.WriteLine("Resultado: " + response.resultado + " - MSG: " + response.msg);
Console.ReadLine();
}
调用成功执行,但服务返回复杂类型(ComprobanteConstatarResponse),其中所有值为空。我已经调试了代码,可以看到java应用程序接收所有参数并正确构建响应,但是当它返回到c#应用程序时,对象具有空值。
任何想法?
找到解决方案了!
在visual studio中,我去了ComprobanteConstatarResponse Definition(在添加服务引用时创建)。这将打开一个Reference.cs文件),我注释了包含命名空间的XmlTypeAttribute:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
//[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://model.ws.solution.client.com")]
public partial class ComprobanteConstatarResponse {
private string codeField;
private string fch_procesoField;
private string msgField;
private string resultadoField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string code {
get {
return this.codeField;
}
set {
this.codeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string fch_proceso {
get {
return this.fch_procesoField;
}
set {
this.fch_procesoField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string msg {
get {
return this.msgField;
}
set {
this.msgField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string resultado {
get {
return this.resultadoField;
}
set {
this.resultadoField = value;
}
}
}
然后我再次测试,并填充了响应值。