Usuário com melhor resposta
Evento Completed do WCF é executado mais de uma vez

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.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.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