none
Problemas con acceso a WCF (se repite el evento) RRS feed

  • Pregunta

  • Mi problema es el siguiente, tengo una pantalla donde hago el ingreso de ciertos datos, para hacer el registro hago referencia a un wcf y todo bien hasta aqui, el problema es que cuando hago registros consecutivos, el evento creado al referenciar a un metodo del wcf,  

    void client_RegistroKilometrajeCompleted(object sender,ServiceReferenceClient.RegistroKilometrajeCompletedEventArgs e)

    {

    ...

    }

    entra en un loop. ¿que es lo que puede estar mal?

    Gracias

    jueves, 13 de septiembre de 2012 23:15

Todas las respuestas

  • ¡Hola!

    No llego a entender muy bien la pregunta. Ese evento se te dispara cuando se ha completado la operación con respecto al servicio wcf. Si lanzas acciones contra el servicio wcf y siempre es la misma este irá saltando a medida que se vayan contemplando.

    Si tienes cualquier duda con respecto al comportamiento del servicio wcf puedes generarte una traza e ir observando lo que te va aconteciendo.

    Por favor, elabora un poco más la pregunta para que te podamos ayudar.

    Un saludo,


    viernes, 14 de septiembre de 2012 0:00
  • Hola, gracias por responder.

    Mira lo que pasa es que cuando llamo al servicio wcf la primera vez, no hay problema me graba los datos, pero cuando lo hago por segunda, tercera, cuarta vez ... ; el evento que puse arriba que es el que se genera al acceder asincronamente al servicio wcf entra en un loop osea se vuelve a llamar varias veces.

    Te pongo el codigo:

    Esta porció de codigo hace referencia al wcf

     //instanciamos objeto de kilometraje entidad del wcf
                        ServiceReferenceClient.KilometrajeEntidad oKM = new ServiceReferenceClient.KilometrajeEntidad();
                        //llenamos objeto
                        oKM.ClienteID = VariablesGlobales.ClienteID;
                        oKM.TelefonoID = VariablesGlobales.TelefonoID;
                        oKM.Destino = idDestino;
                        oKM.KilometroInicio = Convert.ToInt64(this.txtKMInicial.Text);
                        oKM.AutoID = idAuto;

                        //llamamos funcion de wcf para el registro de manera asincrona
                        client.RegistroKilometrajeAsync(oKM);
                        client.RegistroKilometrajeCompleted +=new EventHandler<ServiceReferenceClient.RegistroKilometrajeCompletedEventArgs>(client_RegistroKilometrajeCompleted);

    Este es el evento que entra en un loop:

      void client_RegistroKilometrajeCompleted(object sender,ServiceReferenceClient.RegistroKilometrajeCompletedEventArgs e)
            {
                
                    if (e.Error == null) //si no hay errores
                    {
                        if (e.Result == true)
                        {
                            //Actualizamos auto activo
                            Autos oAutoF = new Autos();
                            oAutoF.ActualizarAutoActivo(idAuto);
                            //limpiamos formulario
                            LimpiarFormulario();
                            MuestraAutoActivo(); //muestra el auto activo en su textbox
                            //mostramos mensaje que se registro satisfactoriamente
                            MessageBox.Show("Kilometraje registrado satisfactoriamente!");
                        }
                        else
                        {
                            //mostramos mensaje de error
                            MessageBox.Show("Error al guardar datos!");
                        }
                    }
     
               
            }

    viernes, 14 de septiembre de 2012 0:19
  • ¡Hola!

    Yo en principio no veo nada extraño. Ninguna de estas funciones:

     oAutoF.ActualizarAutoActivo(idAuto);
     //limpiamos formulario
        LimpiarFormulario();
        MuestraAutoActivo();

    llamará internamente a la función que contiene la instancia del objeto de kilometraje entidad del wcf, ¿verdad?

    Un saludo,

    viernes, 14 de septiembre de 2012 7:18
  • Hola!
    Fijate que cada vez que instancias el proxy WCF añades un manejador al evento RegistroKilometrajeCompleted, la primera vez que llamas solo existe un manejador, la segunda vez añades de nuevo el manejador y ya existen dos, la tercera vez 3... así consecutivamente, se añaden manejadores y cada uno se ejecutará.

    Para solucionarlo, tienes que poner en el método client_RegistroKilometrajeCompleted en primer lugar este codigo:

    client.RegistroKilometrajeCompleted -= client_RegistroKilometrajeCompleted;
    

    Esto le indica al proxy que destruya el manejador que se creo y en la siguiente llamada lo volverás a crear y listo! Todo funcionará sin problemas.

    Ten en cuenta que esto no es exclusivo de WCF, es la forma standard de manejar eventos en C# lo mismo te pasaría con cualquier otro evento de cualquier otra clase.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    • Propuesto como respuesta CorsarioVasco sábado, 15 de septiembre de 2012 7:21
    • Votado como útil CorsarioVasco sábado, 15 de septiembre de 2012 7:22
    • Propuesto como respuesta CorsarioVasco sábado, 15 de septiembre de 2012 7:23
    viernes, 14 de septiembre de 2012 11:36
    Moderador
  • Hola Josue, 

    Gracias por tu respuesta, es justo lo que necesitaba me funciono.

    Solo tengo una duda, esa linea de código la he puesto aqui :  

                        

     void client_RegistroKilometrajeCompleted(object sender,ServiceReferenceClient.RegistroKilometrajeCompletedEventArgs e)
            {
                 //destruye el manejador creado, para que en la siguiente llamada
                    //no hayan 2 manejadores y el evento entre en un loop
                    client.RegistroKilometrajeCompleted -= client_RegistroKilometrajeCompleted;

                    if (e.Error == null) //si no hay errores
                    {
                        if (e.Result == true)
                        {
                            //Actualizamos auto activo
                            Autos oAutoF = new Autos();
                            oAutoF.ActualizarAutoActivo(idAuto);
                            //limpiamos formulario
                            LimpiarFormulario();
                            MuestraAutoActivo(); //muestra el auto activo en su textbox
                            //mostramos mensaje que se registro satisfactoriamente
                            MessageBox.Show("Kilometraje registrado satisfactoriamente!");
                        }
                        else
                        {
                            //mostramos mensaje de error
                            MessageBox.Show("Error al guardar datos!");
                        }
                    }
                }
    }

    O donde es mejor que lo ponga, antes de invocar este evento?        

    Gracias

    viernes, 14 de septiembre de 2012 13:34
  • Hola!

    Gracias por responder, esas funciones no llaman al evento:

    La respuesta de Josue fue la que buscaba, de todos modos muchas gracias por responder se valora la preocupación.

    Gracias

    viernes, 14 de septiembre de 2012 13:36
  • ¡Hola!

    Si cuando  //instanciamos objeto de kilometraje entidad del wcf, intancias también client tampoco hubieras tenido el problema. Después de visto,... ;-)

    Tranqui, para eso estamos. Me alegro que Yeray diera con tu problema. Por favor, cierra la pregunta.

    Un saludo,




    sábado, 15 de septiembre de 2012 7:20