none
Problemas al pasar el coigo de Web a DLL RRS feed

  • Pregunta

  • Hola a todos,

    Tengo una solución Web que funciona correctamente y al intentar copiarlo en una solución DLL me da error en una de las líneas y no sé como resolverlo.

    Alguien me podría ayudar.

    El código es para pasar las facturas electrónicas desde un directorio del equipo del cliente a un organismo publico utilizando el sistema FACE y la llamada al servicio web de ellos : https://webservice.face.gob.es/sspp?wsdl

    Os adjunto la parte del código donde falla, marcando la línea del fallo en negrita e indicando el error que me da.

    Sin mas y en espera de noticias vuestras al respecto, recibid un cordial saludo.

    Miguel

    Imports Microsoft.Web.Services3
    Imports Microsoft.Web.Services3.Security
    Imports Microsoft.Web.Services3.Security.Tokens
    Imports Microsoft.Web.Services3.Security.X509
    Imports Microsoft.Web.Services3.Design
    Imports Microsoft.Web.Services3.RequestSoapContext
    Imports System.Security.Cryptography
    Imports System.IO
    Public Class Class1
        Private Clv As String
        Private Correo As String
        Private Certi As String
        Private DirDatos As String
    
    
        Private Sub proceso()
            leerParametros()
            Dim cert As New System.Security.Cryptography.X509Certificates.X509Certificate2(Certi, Clv)
            Dim webserviceProxy As New facewebservice.SSPPWebServiceProxyService
            webserviceProxy.ClientCertificates.Add(cert)
            Dim factura As New facewebservice.SSPPFactura
            Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
    
            Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
            MsgBox("Punto1")

    El error que da es el siguiente:

    Error 1 'RequestSoapContext' no es un miembro de 'CLFaceEstado.Facewebservice.SSPPWebServiceProxyService'. 

    jueves, 4 de junio de 2015 19:03

Respuestas

  • la herramienta automática de agregar web Reference hace eso, genera el proxy por defecto que hereda de System.Web.Services.Protocols.SoapHttpClientProtocol

    en vez de usar la que necesitas


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:08
    Moderador
  • No, me refería en tu Reference.vb que generas al realizar el add web Reference.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:26
    Moderador
  • En qué linea te salta dicha excepcion? En esta?

    Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
           

    tu método GetSecurityToken(cert) debes declararlo como Shared

    Public Shared Function GetSecurityToken(ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate2) As X509SecurityToken


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    lunes, 8 de junio de 2015 15:18
    Moderador
  • Vale Sergio,ahora lo he entendido y he realizado el cambio y todo va correctamente.

    Muchisimas gracias por tu ayuda y paciencia.

    Un saludo y que te vaya bien.Hasta pronto.

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:34

Todas las respuestas

  • hola

    pero estas creando una web reference al servicio web ? por el codigo entiendo que si

    pero si es asi para que usas el RequestSoapContext ? porque simplemente no invocasel webmethod dirctamente

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de junio de 2015 21:16
  • Hola Leandro, gracias por responder.

    Como se invoca el webmethod,no tengo mucha experiencia,cada dia aprendo cosas nuevas y también gracias a vosotros.

    Espero noticias tuyas.

    Un saludo

    jueves, 4 de junio de 2015 21:44
  • Hola Miguel,

    usa el Intellisense de VS. Cuando escribes 

     webserviceProxy

    y pulsas el punto te deben de aparecer los métodos disponibles. Usa el que necesites


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 5 de junio de 2015 7:54
    Moderador
  • Hola Sergio, eso ya lo he realizado y el que necesito no me aparece cuando estoy en la DLL y si cuando estoy en la solución Web.

    Es el que esta en negrita y no sé si se puede utilizar otro sustituto.

    No se si necesitas alguna información mas par que me puedas ayudar.

    Espero noticias.

    Un saludo y gracias

    viernes, 5 de junio de 2015 15:04
  • analizando el wsdl puedes observar que existen varias operaciones:

    enviarFactura

    consultarFactura

    anularFactura

    consultarEstados

    etc....

    eso lo puedes ver an las etiquetas <operation>.

    no puedes ver esos métodos en tu clase proxy? Si NO es así, te recomiendo vuelvas a generar la web reference


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    viernes, 5 de junio de 2015 15:10
    Moderador
  • Si, Sergio, veo todos los métodos que me dices y más pero el que no veo es el que necesito:

    webserviceProxy.RequestSoapContext

    y cuando utilizo la solución Web y no DLL, lo veo bien y funciona bien pero en la DLL, que es lo que necesito tener ahora para ser llamada, no veo ese método.

    Leandro Tutini me dice lo siguiente: para que usas el RequestSoapContext ? porque simplemente no invocasel webmethod

    Pero no sé a que se refiere con eso.Me alegraría que me pudieras ayudar a ver si damos con lo que necesito hacer para que funcione bien y pueda compilar mi DLL

    Espero noticias.

    Un saldoy gracias de nuevo

    Miguel

    viernes, 5 de junio de 2015 15:27
  • como usas RequestSoapContext en tu solución Web? Ese metodo se usa para obtener acceso al SoapContext de una peticion. Necesitas acceder a dicho contexto? Lo que Tuttini te dice es que uses webProxy.consultarFactura() por ejemplo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    viernes, 5 de junio de 2015 15:32
    Moderador
  • Es que en realidad no se en que puede perjudicar, ya que se utiliza líneas mas abajo.

    Te adjunto el código completo y te marco en negrita las líneas donde se utiliza el resultado de la llamada.

    Esto me lo han pasado y no sé en realidad que esta verificando pero quees necesario.

    Espero me puedas aclarar un poco los cambios que debería hacer para realizar lo mismo si es posible.

    Un saludo

     Private Sub proceso()
            leerParametros()
            Dim cert As New System.Security.Cryptography.X509Certificates.X509Certificate2(Certi, Clv)
            Dim webserviceProxy As New facewebservice.SSPPWebServiceProxyService
            webserviceProxy.ClientCertificates.Add(cert)
            Dim factura As New facewebservice.SSPPFactura
            Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
    
            Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
            MsgBox("Punto1")
            requestContext.Security.Tokens.Add(signatureToken)
            Dim sig As New MessageSignature(signatureToken)
            requestContext.Security.Timestamp.TtlInSeconds = 60
            requestContext.Security.Elements.Add(sig)
            MsgBox("Punto2")
            Dim fra As New facewebservice.SSPPFicheroFactura()
    
            factura.correo = Correo 
    
            '**********************************************************************
            '*** OBTENEMOS UN ARRAY CON LOS FICHEROS A TRATAR
            '**********************************************************************
            Dim tFiles() As String
            tFiles = System.IO.Directory.GetFiles(DirDatos)
    
    
    
            Dim n As Int32 = 0
            n = tFiles.Length - 1
    
            'Dim oFile As System.IO.File
            'Dim oRead As System.IO.StreamReader
            Dim EntireFile As String = ""
            Dim i As Int32 = 0
            'oRead = oFile.OpenText(tFiles(i))
            'EntireFile = oRead.ReadToEnd()
            For i = 0 To n
    
    
                Dim line As String = ""
                Try
    
                    Using sr As New System.IO.StreamReader((tFiles(i))) '"C:\UNIDADE\Proyectos-Desarrollo\Face-Web-Service-master\App\Factura 475 _ MAR _ 2014.xsig")
                        MsgBox("Punto3")
                        line = sr.ReadToEnd()
                        Console.WriteLine(line)
                    End Using
                Catch ex As Exception
                    Console.WriteLine("The file could not be read:")
                    Console.WriteLine(ex.Message)
                End Try
    
                Dim fichero64 As String
                Dim byt As Byte() = System.Text.Encoding.UTF8.GetBytes(line)
                fichero64 = Convert.ToBase64String(byt)
                fra.factura = fichero64
                fra.nombre = tFiles(i) '"Factura 475 _ MAR _ 2014.xsig"
                fra.mime = "application/xml"
    
                factura.fichero_factura = fra
                MsgBox("Punto4")
                Try
    
                    Dim resultadoEnvioFactura As New facewebservice.SSPPResultadoEnviarFactura
                    resultadoEnvioFactura = webserviceProxy.enviarFactura(factura)
                    MsgBox("Punto5 ... " & resultadoEnvioFactura.codigo_registro)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Next
    
        End Sub
    
        Public Function GetSecurityToken(ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate2) As X509SecurityToken
            Dim securityToken As X509SecurityToken = Nothing
    
            Try
                securityToken = New X509SecurityToken(cert)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Return securityToken
        End Function

    viernes, 5 de junio de 2015 15:42
  • ok... Necesitas el contexto para la seguridad. Has referenciado en tu proyecto Microsoft.Web.Services2.dll??

    https://msdn.microsoft.com/en-us/library/microsoft.web.services2.requestsoapcontext.aspx?f=255&MSPPError=-2147217396


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 5 de junio de 2015 15:51
    Moderador
  • Tengo referenciado lo siguiente:

    Imports Microsoft.Web.Services3
    Imports Microsoft.Web.Services3.Security
    Imports Microsoft.Web.Services3.Security.Tokens
    Imports Microsoft.Web.Services3.Security.X509
    Imports Microsoft.Web.Services3.Design
    Imports Microsoft.Web.Services3.RequestSoapContext
    Imports System.Security.Cryptography
    Imports System.IO

    viernes, 5 de junio de 2015 15:59
  • Que cambios debo hacer en el código entonces:

    Porque si meto la línea Dim requestSoapContext1 As RequestSoapContext, entonces me da errores donde utilice

      requestContext.Security.

    No sé si hay cambios ha realizar y cuales..

    viernes, 5 de junio de 2015 16:02
  • si te fijas en tu clase proxy... Te situas en ella y pulsas F12 seguramente esté heredando de System.Web.Services.Protocols.SoapHttpClientProtoc ok. Modifica para que herede de Microsoft.Web.Services3.WebServicesClientProtocol

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 5 de junio de 2015 16:05
    Moderador
  • la herramienta automática de agregar web Reference hace eso, genera el proxy por defecto que hereda de System.Web.Services.Protocols.SoapHttpClientProtocol

    en vez de usar la que necesitas


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:08
    Moderador
  • No se si te refieres al cambio que he realizado en la definición del Proxy, que te marco en negrita, que si soluciona las líneas que daban error pero ahora tengo el problema de que el envio de factura no funciona... te lo marco mas abajo e n negrita también.

    Gracias por tu inestimable ayuda.

    A ver si cambiando lo que me digas ya damos por bueno el código.

     Private Sub proceso()
            leerParametros()
            Dim cert As New System.Security.Cryptography.X509Certificates.X509Certificate2(Certi, Clv)
            Dim webserviceProxy As New Microsoft.Web.Services3.WebServicesClientProtocol
            webserviceProxy.ClientCertificates.Add(cert)
            Dim factura As New facewebservice.SSPPFactura
            Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
    
            Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
            MsgBox("Punto1")
            requestContext.Security.Tokens.Add(signatureToken)
            Dim sig As New MessageSignature(signatureToken)
            requestContext.Security.Timestamp.TtlInSeconds = 60
            requestContext.Security.Elements.Add(sig)
            MsgBox("Punto2")
            Dim fra As New facewebservice.SSPPFicheroFactura()
    
            factura.correo = Correo ' "adm@nubit.es"
    
            '**********************************************************************
            '*** OBTENEMOS UN ARRAY CON LOS FICHEROS A TRATAR
            '**********************************************************************
            Dim tFiles() As String
            tFiles = System.IO.Directory.GetFiles(DirDatos)
    
    
    
            Dim n As Int32 = 0
            n = tFiles.Length - 1
    
            'Dim oFile As System.IO.File
            'Dim oRead As System.IO.StreamReader
            Dim EntireFile As String = ""
            Dim i As Int32 = 0
            'oRead = oFile.OpenText(tFiles(i))
            'EntireFile = oRead.ReadToEnd()
            For i = 0 To n
    
    
                Dim line As String = ""
                Try
    
                    Using sr As New System.IO.StreamReader((tFiles(i))) '"C:\UNIDADE\Proyectos-Desarrollo\Face-Web-Service-master\App\Factura 475 _ MAR _ 2014.xsig")
                        MsgBox("Punto3")
                        line = sr.ReadToEnd()
                        Console.WriteLine(line)
                    End Using
                Catch ex As Exception
                    Console.WriteLine("The file could not be read:")
                    Console.WriteLine(ex.Message)
                End Try
    
                Dim fichero64 As String
                Dim byt As Byte() = System.Text.Encoding.UTF8.GetBytes(line)
                fichero64 = Convert.ToBase64String(byt)
                fra.factura = fichero64
                fra.nombre = tFiles(i) '"Factura 475 _ MAR _ 2014.xsig"
                fra.mime = "application/xml"
    
                factura.fichero_factura = fra
                MsgBox("Punto4")
                Try
    
                    Dim resultadoEnvioFactura As New facewebservice.SSPPResultadoEnviarFactura
                    resultadoEnvioFactura = webserviceProxy.enviarFactura(factura)... esta línea da error ahora
                    MsgBox("Punto5 ... " & resultadoEnvioFactura.codigo_registro)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Next
    
        End Sub

    viernes, 5 de junio de 2015 16:15
  • No, me refería en tu Reference.vb que generas al realizar el add web Reference.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:26
    Moderador
  • Vale Sergio,ahora lo he entendido y he realizado el cambio y todo va correctamente.

    Muchisimas gracias por tu ayuda y paciencia.

    Un saludo y que te vaya bien.Hasta pronto.

    • Marcado como respuesta MiguelVB viernes, 5 de junio de 2015 16:34
    viernes, 5 de junio de 2015 16:34
  • Hola Sergio, disculpa que te escriba directamente con este caso pero una vez resuelto el problema y querer meter el código en una función para ser llamada desde fuera y pasarme parámetros, me da el error siguiente y lo desconozco, es  la primera vez que me pasa y no se porque ni que tengo que hacer.

    Te paso parte del código donde marco en negrita las líneas de error.

    El error que me da dice:

    "No se puede hacer referencia a un miembro de estancia de una clase desde un método compartido o un inicializador de método compartido sin una instancia explicita en la clase."

    Espero me puedas ayudar una vez mas.

    Gracias y un saludo.

    Miguel

    Imports Microsoft.Web.Services3
    Imports Microsoft.Web.Services3.Security
    Imports Microsoft.Web.Services3.Security.Tokens
    Imports Microsoft.Web.Services3.Security.X509
    Imports Microsoft.Web.Services3.Design
    Imports Microsoft.Web.Services3.RequestSoapContext
    Imports System.Security.Cryptography
    Imports CLFaceEstado.Facewebservice
    Imports System.IO
    Public Class Class1
        Private Clv As String
        Private Correo As String
        Private Certi As String
        Private DirDatos As String
    
      
        Public Shared Function ProcesoFace(ByVal VCerti As String, ByVal VClv As String, ByVal VCorreo As String, ByVal VDirDatos As String, ByVal VDirCopia As String) As Integer
            Dim Resultado As Integer = 0
            'leerParametros()
            Dim cert As New System.Security.Cryptography.X509Certificates.X509Certificate2(Certi, Clv)
            Dim webserviceProxy As New facewebservice.SSPPWebServiceProxyService
            webserviceProxy.ClientCertificates.Add(cert)
            Dim factura As New facewebservice.SSPPFactura
            Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
            Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
            requestContext.Security.Tokens.Add(signatureToken)

    lunes, 8 de junio de 2015 15:08
  • En qué linea te salta dicha excepcion? En esta?

    Dim signatureToken As X509SecurityToken = GetSecurityToken(cert)
           

    tu método GetSecurityToken(cert) debes declararlo como Shared

    Public Shared Function GetSecurityToken(ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate2) As X509SecurityToken


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    lunes, 8 de junio de 2015 15:18
    Moderador
  • Vaya, es cierto, ya ha quedado resuelto.

    Un saludo y gracias de nuevo

    lunes, 8 de junio de 2015 16:07