none
Implementar Web Reference en la capa de servicio RRS feed

  • Pregunta

  • Hola

    Trabajo con Visual Studio 2015, Windows Form y un servicio que consume un XML lo estoy implementando en la capa de Servicios(capa lógica).

    Capa Servicios

    public void ValidarComprobanteAsync(string rutaFirma, string claveFirma, string rutaXml)
            {
                using (var pruebaWs1 = new TecSoftware.ServiciosDominio.ec.gob.sri.celcer.RecepcionComprobantesOfflineService())
                {
                    var xmlDoc = new XmlDocument();
                    var uidCert = GetCertificateByPath(rutaFirma, claveFirma);
                    pruebaWs1.Url = $"{_sriUrlPrueba}{"RecepcionComprobantesOffline"}";
                    pruebaWs1.ClientCertificates.Add(uidCert);
                    FirmaXades firmaXades = new FirmaXades(SignMethod.RSAwithSHA1, DigestMethod.SHA1);
                    xmlDoc.Load(rutaXml);
    
                    XElement doc = XElement.Parse(xmlDoc.InnerXml);
                    var result = doc.Elements("infoTributaria")
                        .Elements("claveAcceso").ToArray();
                    _claveAcceso = result[0].Value;
    
                    xmlDoc.PreserveWhitespace = true;
                    firmaXades.SetContentEnveloped(xmlDoc);
                    firmaXades.Sign(uidCert, SignMethod.RSAwithSHA1);
    
                    pruebaWs1.validarComprobanteCompleted += PruebaWs1OnValidarComprobanteCompleted;
                    pruebaWs1.validarComprobanteAsync(System.Text.Encoding.UTF8.GetBytes(firmaXades.Document.InnerXml));
                }
            }
    
            private void PruebaWs1OnValidarComprobanteCompleted(object sender, validarComprobanteCompletedEventArgs comprobanteCompletedEventArgs)
            {
                if (!string.IsNullOrEmpty(comprobanteCompletedEventArgs.Result.estado))
                {
                    _estadoRecepcionPrueba = comprobanteCompletedEventArgs.Result.estado;
                    if (_estadoRecepcionPrueba == "RECIBIDA")
                    {
                        try
                        {
                            using (var pruebaWs2 = new AutorizacionComprobantesOfflineService())
                            {
                                var pruebaAutorizacion = pruebaWs2.autorizacionComprobante(_claveAcceso);
                                var listAutorizaciones = pruebaAutorizacion.autorizaciones;
                                foreach (var encontrado in listAutorizaciones)
                                {
                                    _estadoAutorizacionPrueba = encontrado.estado;
                                    _fechaAutorizacion = encontrado.fechaAutorizacion;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    if (_estadoRecepcionPrueba == "DEVUELTA")
                    {
                        var mensajeDevuelta = comprobanteCompletedEventArgs.Result.comprobantes.ToList();
                        foreach (var x in mensajeDevuelta)
                        {
                            foreach (var y in x.mensajes)
                            {
                                _identificador = y.identificador;
                                _mensaje1 = y.mensaje1;
                                _tipo = y.tipo;
                            }
                        }
                    }
                }
                _mensaje = _estadoRecepcionPrueba + " " + _identificador + " " + _mensaje1 + " " + _tipo + " " +
                           _estadoAutorizacionPrueba + " " + _fechaAutorizacion;
            }


    Uno de los temas importantes es que el segundo web service se consulte cuando el primer web service aya respondido y para eso uso el evento completed, el problema es que el primer método cuando culmina regresa a presentación y luego sigue con el evento completed(regresa a la capa de servicios)

    Presentación

    private void btnProcesar_Click(object sender, EventArgs e)
            {
                if (AmbienteType.Prueba == _ambiente)
                {
                    try
                    {
                        if (string.IsNullOrEmpty(_rutaXml))
                        {
                            MessageBox.Show(@"Debe escoger una Factura de xml", @"Mensaje");
                            return;
                        }
                        _rutaFirma = @"C:\Users\Acer\Desktop\Pta\xxxxxxxxxxxxxxxxxxxx.p12";
                        _sdWebServicePrueba.ValidarComprobanteAsync(_rutaFirma, _claveFirma, _rutaXml);
                        
                        if (String.IsNullOrEmpty(_sdWebServicePrueba._mensaje))
                            MessageBox.Show($"{_sdWebServicePrueba._mensaje}", @"Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show($"{ex.Message}", @"Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                if (AmbienteType.Produccion == _ambiente)
                {
                    
                }
            }

    El primer ws que consumo es un void en proxy y no me devuelve nada de mensajes el método completed es el que devuelve los mensajes.

    ¿Como debería de implementar los dos web service en la capa de servicios?, ¿Hay alguna manera de traer los mensajes a presentación cuando el evento Completed haya hecho su recorrido?

    Saludos!

     

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    viernes, 18 de enero de 2019 10:28

Respuestas

  • Si he comprendido bien lo que quieres hacer, el remedio sería declarar un evento público en la capa de servicios y suscribirte a ese evento desde la capa de presentación. De esa manera, cuando por fin termine el evento Completed, disparas desde ahí tu evento público, y así la capa de presentación recibe por esa vía la notificación de que terminó la ejecución de las llamadas a los servicios web.
    • Marcado como respuesta Pedro Ávila viernes, 18 de enero de 2019 15:48
    viernes, 18 de enero de 2019 13:51
    Moderador

Todas las respuestas

  • Si he comprendido bien lo que quieres hacer, el remedio sería declarar un evento público en la capa de servicios y suscribirte a ese evento desde la capa de presentación. De esa manera, cuando por fin termine el evento Completed, disparas desde ahí tu evento público, y así la capa de presentación recibe por esa vía la notificación de que terminó la ejecución de las llamadas a los servicios web.
    • Marcado como respuesta Pedro Ávila viernes, 18 de enero de 2019 15:48
    viernes, 18 de enero de 2019 13:51
    Moderador
  • Hola @Alberto

    Había pensado en eso pero no estaba seguro que se podía hacer eso.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 18 de enero de 2019 14:02
  • no estaba seguro que se podía hacer eso.

    En una aplicación de escritorio, sí se puede hacer. En una aplicación web no se podría.

    Ten presente que el evento Completed se dispara en un hilo diferente. A la capa de negocio le da lo mismo, pero en la capa de interfaz de usuario tienes que tener la precaución de no escribir nada en pantalla desde ese evento, ya que la pantalla no admite ser modificada desde un hilo distinto. Si necesitases presentarle algo al usuario, tendrías que aplicar las precauciones usuales cuando se programa en multihilo, tales como usar el método Invoke (si es un Winform) para transportar la ejecución al hilo principal.

    viernes, 18 de enero de 2019 15:20
    Moderador
  • Hola @Alberto

    Ya lo tengo

    Capa de Servicios

    private void PruebaWs1OnValidarComprobanteCompleted(object sender, validarComprobanteCompletedEventArgs comprobanteCompletedEventArgs)
            {
                if (!string.IsNullOrEmpty(comprobanteCompletedEventArgs.Result.estado))
                {
                    _estadoRecepcionPrueba = comprobanteCompletedEventArgs.Result.estado;
                    if (_estadoRecepcionPrueba == "RECIBIDA")
                    {
                        try
                        {
                            using (var pruebaWs2 = new AutorizacionComprobantesOfflineService())
                            {
                                var pruebaAutorizacion = pruebaWs2.autorizacionComprobante(_claveAcceso);
                                var listAutorizaciones = pruebaAutorizacion.autorizaciones;
                                foreach (var encontrado in listAutorizaciones)
                                {
                                    _estadoAutorizacionPrueba = encontrado.estado;
                                    _comprobante = encontrado.comprobante;
                                    _fechaAutorizacion = encontrado.fechaAutorizacion;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    if (_estadoRecepcionPrueba == "DEVUELTA")
                    {
                        var mensajeDevuelta = comprobanteCompletedEventArgs.Result.comprobantes.ToList();
                        foreach (var x in mensajeDevuelta)
                        {
                            foreach (var y in x.mensajes)
                            {
                                _identificador = y.identificador;
                                _mensaje1 = y.mensaje1;
                                _tipo = y.tipo;
                            }
                        }
                    }
                }
    
                _hub.Publish(new SelectedMensajeWsPrueba()
                {
                    EstadoRecepcionPrueba = _estadoRecepcionPrueba,
                    Comprobante = _comprobante,
                    FechaAutorizacion = _fechaAutorizacion,
                    Identificador = _identificador,
                    Mensaje1 = _mensaje1,
                    Tipo = _tipo
                });
            }

    Presentación

    private void btnProcesar_Click(object sender, EventArgs e)
            {
                if (AmbienteType.Prueba == _ambiente)
                {
                    try
                    {
                        if (string.IsNullOrEmpty(_rutaXml))
                        {
                            MessageBox.Show(@"Debe escoger una Factura de xml", @"Mensaje");
                            return;
                        }
    
                        if (!string.IsNullOrEmpty(_rutaFirma) && !string.IsNullOrEmpty(_claveFirma)
                            && !string.IsNullOrEmpty(_rutaXml))
                        {
                            var token = _hub.Subscribe<SelectedMensajeWsPrueba>(OnWsPruebaSelected);
                            _sdWebServicePrueba.ValidarComprobanteAsync(_rutaFirma, _claveFirma, _rutaXml);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show($"{ex.Message}", @"Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                if (AmbienteType.Produccion == _ambiente)
                {
                    
                }
            }
    
            private void OnWsPruebaSelected(SelectedMensajeWsPrueba obj)
            {
                if (!string.IsNullOrEmpty(obj.EstadoRecepcionPrueba))
                {
                    if (obj.EstadoRecepcionPrueba == "DEVUELTA")
                    {
                        MessageBox.Show($"Identificador: {obj.Identificador} Mensaje: {obj.Mensaje1} Tipo: {obj.Tipo}",
                            @"Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }

    Pantalla

    Saludos!

    Nota: Gracias por todo.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 18 de enero de 2019 15:47