Ver Mensaje Individual
  #1773  
Antiguo 16-06-2017
pilarinweb pilarinweb is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 5
Reputación: 0
pilarinweb Va por buen camino
Question Cabeceras SII

Cita:
Empezado por bartag Ver Mensaje
Te pongo el código que utilizo. Básicamente lo que hace es tomar un archivo xml y lo envía. Debes por favor cumplimentar previamente los campos de dicho archivo pues en caso contrario te dará errores de validación.

Código:
        ' ----------------------------------------------------------------------------------------
        Dim store As Security.Cryptography.X509Certificates.X509Store = New Security.Cryptography.X509Certificates.X509Store("My")
        store.Open(Security.Cryptography.X509Certificates.OpenFlags.ReadOnly)

        Dim CertificadoCorrecto As New System.Security.Cryptography.X509Certificates.X509Certificate2
        
        For Each x In store.Certificates
            ListCert = ListCert & vbNewLine
        Next
        'RichTextBox1.Text = ListCert

        CertificadoCorrecto = store.Certificates(CInt(TextBoxNumeroOrdenCertificado.Text)) '(5)

        ' Objeto que almacenara la respuesta de la funcion del Web Service
        Dim resp As New ServiceReference1.RespuestaLRFEmitidasType

        ' Ws
        Dim Ws As New ServiceReference1.siiSOAPClient

        Ws.ClientCredentials.ClientCertificate.Certificate = CertificadoCorrecto
        Ws.ClientCredentials.UseIdentityConfiguration = True

        ' Asignamos el certificado:
        Ws.ClientCredentials.ClientCertificate.Certificate = CertificadoCorrecto
        ' ----------------------------------------------------------------------------------------


        ' ----------------------------------------------------------------------------------------
        Dim _SuministroLRFacturasEmitidas As New SuministroLRFacturasEmitidas
        '--------------------------------------------------------------------------
        
        Try

            Dim x As New XmlSerializer(_SuministroLRFacturasEmitidas.GetType, "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd") 

            ' A FileStream is needed to read the XML document.
            Dim filename As String = "facturaEmitidaMODEL.XML"


            Using reader As New FileStream(filename, FileMode.Open)
                _SuministroLRFacturasEmitidas = CType(x.Deserialize(reader), SuministroLRFacturasEmitidas)
            End Using

            ' SI QUEREMOS SOBREESCRIBIR EL XML ANTES DE ENVIAR:
            ' SOBREESCRIBIMOS DATS FORM ANTES SEND:
            _SuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon = Trim(TextBoxRazonSocialEmisor.Text)
            _SuministroLRFacturasEmitidas.Cabecera.Titular.NIF = Trim(TextBoxNIFEmisor.Text)

           '(...)

           '// se hace la llamada a la funcion suministrada por el WS
            resp = Ws.SuministroLRFacturasEmitidas(_SuministroLRFacturasEmitidas)

            Catch ex As Exception
            MsgBox(ex.Message)
            Respuesta2RichTextBox = ex.Message
        Finally
            'Me.Cursor = Cursors.Default
            'Threading.Thread.Sleep(5000)
            'ProgressBar1.Style = ProgressBarStyle.Continuous
            ''ProgressBar1.Value = ProgressBar1.Maximum
        End Try
Te adjunto también el archivo xml que debes cumplimentar donde indica '[A CUMPLIMENTAR]'.

Con esto, se toma la factura del archivo (fíjate que solamente tiene el nodo '<SuministroLRFacturasEmitidas>' y nada del encabezado SOAP para que no dé error al aplicar el Deserialize) y nos la convierte en un objeto serializado donde podemos acceder a los campos de la clase antes de enviar si lo deseamos; en caso contrario se envía y la propia llamada se encarga de insertar las cabeceras, los namespaces, etc.
Hola bartag,
estoy atascada en este tema también, a ver si me puedes ayudar....aunque mi codigo es C#...
genero dinamicamente un fichero xml:
xmlWriter = new XmlTextWriter(nombrefichero, Encoding.UTF8);
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.Indentation = 4;
xmlWriter.WriteRaw("<?xml version='1.0' encoding='UTF-8'?>");
xmlWriter.WriteStartElement("soapenv:Envelope");
xmlWriter.WriteAttributeString("xmlns", "soapenv", null, "...schemas.xmlsoap.org/soap/envelope/");
xmlWriter.WriteAttributeString("xmlns", "siiLR", null, "....agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd");
xmlWriter.WriteAttributeString("xmlns", "sii", null, "....agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd");

xmlWriter.WriteStartElement("soapenv:Header");
xmlWriter.WriteEndElement();

xmlWriter.WriteStartElement("soapenv:Body");
xmlWriter.WriteStartElement("siiLR:SuministroLRFacturasEmitidas");
.
.
.
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
.
.
.
System.IO.FileStream fStream = new System.IO.FileStream(nombrefichero, System.IO.FileMode.Open);
SuministroFactEmitidas.SuministroLRFacturasEmitidas oSfe = new SuministroFactEmitidas.SuministroLRFacturasEmitidas();
oSfe = (SuministroFactEmitidas.SuministroLRFacturasEmitidas)oXmlSerializer.Deserialize(fStream);

me da error
Error en el documento XML (2, 2).
No se esperaba <Envelope xmlns='...schemas.xmlsoap.org/soap/envelope/'>.

que estoy haciendo mal???

Gracias
Un saludo
Responder Con Cita