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.