来自C#客户端Glassfish中Web服务的响应

本文关键字:服务 响应 Web 客户端 Glassfish 来自 | 更新日期: 2023-09-27 18:22:10

我遇到了一个问题,我的C#客户端无法解析Glassfish中Web服务中的数据。

我的Web服务有一个WSDL和XSD,如下所示:

  • http://www.consorciovivedigital.com:8080/ServicioInterventoria/ServicioInterventoria?WSDL
  • http://www.consorciovivedigital.com:8080/ServicioInterventoria/ServicioInterventoria?xsd=1

我正在使用下一个C#客户端来测试这个Web服务:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using ServicioInterventoria;
public partial class _Default : System.Web.UI.Page 
{
    ServicioInterventoria.ServicioInterventoria proxy;
    protected void Page_Load(object sender, EventArgs e)
    {
        proxy = new ServicioInterventoria.ServicioInterventoria();
        ResultadoMensualIC[] res = proxy.ObtenerResultadosMensuales("Intv12", "2014-07-07T08:08:08");
        System.Diagnostics.Debug.WriteLine(res.Length);
        System.Diagnostics.Debug.WriteLine(res[0].FechaCorte);
    }
}

问题是,当我执行此代码时,res数组具有应该具有的对象数量,但每个对象的每个值都有默认值,而不是正确的值。我使用Fiddler来检查流量,它会接收到带有正确数据的正确SOAP响应,但我的C#客户端似乎不知道如何解析数据。

我用Java客户端进行了检查,我可以毫无问题地获得正确的数据,而且我的C#似乎是唯一一个出现问题的。

也许SOAP响应中的targetNamespace有问题,但我不明白为什么在Java中工作正常,而在C#中只使用默认值。

有人知道可能是什么问题吗?

如果有人需要更多信息,请告诉我

事先感谢

来自C#客户端Glassfish中Web服务的响应

我上周解决了。问题是SOAP响应没有为每个属性设置名称空间,然后,C#客户端不知道如何匹配(这似乎是C#的限制)。另一个问题是SOAP响应的顺序,因为C#客户端期望WSDL中定义的每个对象,但响应是按字母顺序排列的,这样一来,C#客户端就无法正确匹配每个属性。

我对客户做了一些修改。首先,在每个模型中,我为每个属性添加了名称空间,如下所示:

@XmlElement(name = "IdInterventor", namespace = "http://ws.bigdatasolutions.co/")
public String getIdInterventor() {
    return IdInterventor;
}

这样,SOAP响应总是为每个属性放置名称空间,这对于C#客户端来说是必要的。

之后,在每个模型类的开头,我添加了这个标记,以定义WSDL中定义的顺序,并为C#客户端定义。

@XmlRootElement(name = "AspectosFinancieros")
@XmlType(propOrder={"idInterventor", "numeroContrato", "ano", "valorContratoOperador", "fechaFirmaContrato",
                    "valorAdicion", "fechaProrrogaAdicion", "valorDesembolso", "fechaPagoDesembolso", 
                    "valorAnticipo", "fechaAnticipo", "valorUtilizacion", "numeroActaAprobacion",
                    "fechaUtilizacion", "valorRendimiento", "fechaRendimiento", "numeroComprobanteRendimiento",
                    "valorComision", "fechaComision", "valorGastosAdministrativos", "fechaGastosAdministrativos",
                    "nombreFiducia", "numeroContratoFiducia", "fechaContratoFiducia", "fechaProrrogaAdicionFiducia",
                    "marcaTiempo"})
public class AspectosFinancieros {

我在C#客户端的自动生成类中检查了预期的顺序。

我希望有人觉得这很有用。