none
Evento Completed do WCF é executado mais de uma vez RRS feed

  • Pergunta

  • Boa tarde.

    Criei um exemplo simples. Um botão que chama um wcf e mostra um MessageBox. A primeira vez funciona, já na segunda tentativa ele mostra a MessageBox varias vezes. Ele está voltando no inicio da rotina. Alguem consegue me ajudar com este erro?

    Veja o codigo abaixo:

    MainPage.xaml:

    <UserControl x:Class="Login.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
        mc:Ignorable="d" d:DesignHeight="504" d:DesignWidth="844">
    
        <Grid x:Name="LayoutRoot">
            <Grid x:Name="MainArea" Background="#FF223C4C">
                <Grid Margin="200,40,200,102" Name="MainPage1" Background="white" Height="180" VerticalAlignment="Center" HorizontalAlignment="Center" Width="326" Grid.Row="1" Grid.Column="1">                
                    <Button Content="Ok" Height="23" HorizontalAlignment="Left" Name="btOk" VerticalAlignment="Top" Width="82" Click="btOk_Click" Margin="120,70,0,0" />                
                </Grid>
            </Grid>
        </Grid>
    </UserControl>

    MainPage.xaml.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    
    namespace Login
    {
        public partial class MainPage : UserControl
        {
            SV_Report.Service1Client service = new SV_Report.Service1Client();
    
            int intContSessao = 0;
    
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void btOk_Click(object sender, RoutedEventArgs e)
            {
                service.GetSessionCompleted += new EventHandler<SV_Report.GetSessionCompletedEventArgs>(service_GetSessionCompleted);            
                service.GetSessionAsync("TESTE");
            }
            
            void service_GetSessionCompleted(object sender, SV_Report.GetSessionCompletedEventArgs e)
            {               
                if (e.Error == null)
                {
                    if (e.Result.Equals(""))
                        intContSessao = 0;
                    else
                        intContSessao = Convert.ToInt16(e.Result as string);
    
                    intContSessao = intContSessao + 1;
    
                    if (intContSessao == 1)
                    {
                        MessageBox.Show("Limite de conexões excedidas.");
                    }               
                }
            }
    
        }
    }

    Service Interface:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Login.Web
    {
        // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
        [ServiceContract]
        public interface IService1
        {        
            [OperationContract]
            void SetSession(string Key, string value);
    
            [OperationContract]
            string GetSession(string Key);
        }
    }

    class service:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.ServiceModel.Activation;
    using System.Web;
    using System.Web.Hosting;
    
    namespace Login.Web
    {
        // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class Service1 : IService1
        {
            public void SetSession(string Key, string value)
            {
                HttpContext.Current.Session[Key] = value;
            }
    
            public string GetSession(string Key)
            {
                return (HttpContext.Current.Session[Key] ?? "").ToString();
            }
        }
    }

    Obrigada

    Teles


    sexta-feira, 24 de fevereiro de 2012 18:24

Respostas

  • Teles,

    No evento de click você está atachando um novo delegate a cada click, e como o service está no escopo do formulário, cada vez que clicar no butão você esta atachando um novo delegate.

    Você pode passar essa linha para o construtor:

    service.GetSessionCompleted +=new EventHandler<SV_Report.GetSessionCompletedEventArgs>(service_GetSessionCompleted);

    Dessa forma o evento será atachado somente uma vez na criação do formulário.


    Atenciosamente, Paulo R. Pereira de Souza
    http://paulosouza.net
    E-mail: paulorpereirasouza@hotmail.com. twitter facebook linkedin

    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:36
    • Não Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    domingo, 26 de fevereiro de 2012 18:14
  • Boa tarde, Paulo.

    Funcionou. Obrigada.

    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    domingo, 26 de fevereiro de 2012 20:36

Todas as Respostas

  • Teles,

    No evento de click você está atachando um novo delegate a cada click, e como o service está no escopo do formulário, cada vez que clicar no butão você esta atachando um novo delegate.

    Você pode passar essa linha para o construtor:

    service.GetSessionCompleted +=new EventHandler<SV_Report.GetSessionCompletedEventArgs>(service_GetSessionCompleted);

    Dessa forma o evento será atachado somente uma vez na criação do formulário.


    Atenciosamente, Paulo R. Pereira de Souza
    http://paulosouza.net
    E-mail: paulorpereirasouza@hotmail.com. twitter facebook linkedin

    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:36
    • Não Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    domingo, 26 de fevereiro de 2012 18:14
  • Boa tarde, Paulo.

    Funcionou. Obrigada.

    • Marcado como Resposta Teles domingo, 26 de fevereiro de 2012 20:37
    domingo, 26 de fevereiro de 2012 20:36