Consumir webservices del SRI para Facturacion Electronica

From codeWiki
Revision as of 16:22, 18 December 2014 by VictorEspina (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Muchas personas que han entrado en esto del tema de la facturación electronica en Ecuador se han encontrado con problemas a la hora de consumir los webservices publicados por el SRI desde .NET, debido a que el XML de respuesta no es interpretado correctamente por .NET resultando en una colección de comprobantes vacía.

Una de las soluciones planteadas a este problema es usar HttpWebRequest para enviar la solicitud. Pero hay otra forma, que es cambiar el tipo de datos que devuelve el metodo validarComprobante. Simplemente ubicamos el siguiente código en el archivo Reference.cs generado por .NET al registrar la referencia Web:


 public respuestaSolicitud validarComprobante([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, 
            DataType="base64Binary")] byte[] xml) {
     object[] results = this.Invoke("validarComprobante", new object[] {xml});
     return ((respuestaSolicitud)(results[0]));
}

y lo cambiamos por este:

 public object validarComprobante([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, 
           DataType="base64Binary")] byte[] xml) {
     object[] results = this.Invoke("validarComprobante", new object[] {xml});
     return results[0];
 }

Luego, al momento de invocar el metodo validarComprobante en nuestro código, hacemos lo siguiente:

 XmlNode[] resp = (XmlNode[])ws.validarComprobante(xml);
 wsEnvioRespuesta r = new wsEnvioRespuesta(resp);

y ya tenemos nuestra respuesta expresada en un modelo de objetos facilmente utilizable. Les dejo el código para la estructura wsEnvioRespuesta y las demas estructuras relacionadas.


 public struct wsEnvioRespuesta
 {
     public string estado;
     public wsEnvioComprobante[] comprobantes;
 
     public wsEnvioRespuesta(XmlNode[] data)
     {
         estado = data[0].FirstChild.Value;
         XmlNode nodoComp = data[1];
         comprobantes = new wsEnvioComprobante[nodoComp.ChildNodes.Count];
         for (int i = 0; i < nodoComp.ChildNodes.Count; i++)
             comprobantes[i] = new wsEnvioComprobante(nodoComp.ChildNodes[i]);
     }
 }
 
 public struct wsEnvioComprobante
 {
     public string claveAcceso;
     public wsEnvioMensaje[] mensajes;
 
     public wsEnvioComprobante(XmlNode data)
     {
         XmlNodeList nodes = data.ChildNodes;            
         claveAcceso = nodes[0].FirstChild.Value;
 
         XmlNodeList msj = nodes[1].ChildNodes;
         mensajes = new wsEnvioMensaje[msj.Count];
         for (int i = 0; i < msj.Count; i++)
             mensajes[i] = new wsEnvioMensaje(msj[i]);
     }
 }
 
 public struct wsEnvioMensaje
 {
     public string identificador;
     public string mensaje;
     public string informacionAdicional;
     public string tipo;
 
     public wsEnvioMensaje(XmlNode data)
     {
         XmlNodeList nodes = data.ChildNodes;
         identificador = nodes[0].FirstChild.Value;
         mensaje = nodes[1].FirstChild.Value;
         informacionAdicional = nodes[2].FirstChild.Value;
         tipo = nodes[3].FirstChild.Value;
     }
 }
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox