locked
Fechamento do navegador (Tratar Sessão) RRS feed

  • Pergunta

  • Olá a todos,

    Tenho uma aplicação Silverlight C# no qual utilizo MEF para que ela seja carregada conforme a demanda. Utilizo WCF Service para operações de cadastros e WCF Service Duplex para algumas exceções, que é onde entra meu problema.

    Tenho no meu sistema algumas telas de supervisão (ex: Supervisão Pessoa e Supervisão Veículo), para cada cliente que esta cessando alguma dessas supervisões eu adiciono um "cliente" para a minha LIST (abaixo) no serviço.

    private static List<IncServicoDuplexOnline> clientesPessoa = new List<IncServicoDuplexOnline>();
    private static List<IncServicoDuplexOnline> clientesVeiculo = new List<IncServicoDuplexOnline>();
    

    Vamos levar em consideração que eu tenha 3 clientes na Supervisão Pessoa e 2 Clientes na Supervisão Veículo. Caso algum dos clientes faça o cadastro de uma pessoa, os outros 2 clientes irão receber este cadastro que será adicionado em um DATAGRID, pois ao adicionar eu faço uma chamada ASYNC que faz um FOREACH na minha LIST de clientesPessoa e envia esta cadastro para a quantidade de cliente que contém na LIST, da mesma forma para o Supervisão de Veículo. Isso funciona perfeitamente, o problema está relacionado quando um dos clientes fecha o navegador, pois eu preciso que seja removido AQUELE cliente da LIST, por exemplo, ao fechar o Browser seja chamado o serviço que decrementa o cliente corrente da LIST (este serviço já existe, segue código de incluir e remover abaixo) passando de 3 clientes para 2 no Supervisão Pessoa.

    Loaded do Supervisao Pessoa (acrescenta um cliente)

    servicoWCF = new IncServicoClient();
    servicoWCF.VinculaClienteAsync("pessoa");
    
    //Código no Serviço
    
            public void VinculaCliente(string strProjeto)
            {
                //GetCallbackChannel - obter o canal de comunicação entre o serviço e o cliente - retornará a instância do canal entre o serviço e o cliente.
                IncServicoDuplex cliente = OperationContext.Current.GetCallbackChannel<IncServicoDuplex>();
    
                //A palavra-chave lock marca um bloqueio de instruções como uma seção crítica, obter o bloqueio de exclusão de mútua para um determinado objeto, 
                //executar uma instrução e, em seguida, liberar o bloqueio.
                switch (strProjeto)
                {
                    case "pessoa":
                        lock (clientesPessoa)
                        {
                            clientesPessoa.Add(cliente);
                        }
                        break;
    
                    case "veiculo":
                        lock (clientesVeiculo)
                        {
                            clientesVeiculo.Add(cliente);
                        }
                        break;
                }
            }

    Unloaded do Supervisão Pessoa (decrementa um cliente)

    servicoWCF.DesvinculaClienteAsync("pessoa");
    
    //Código do serviço
            public void DesvinculaCliente(string strProjeto)
            {
                //GetCallbackChannel - obter o canal de comunicação entre o serviço e o cliente - retornará a instância do canal entre o serviço e o cliente.
                IncServicoDuplex cliente = OperationContext.Current.GetCallbackChannel<IncServicoDuplex>();
    
                //A palavra-chave lock marca um bloqueio de instruções como uma seção crítica, obter o bloqueio de exclusão de mútua para um determinado objeto, 
                //executar uma instrução e, em seguida, liberar o bloqueio.
    
                switch (strProjeto)
                {
                    case "pessoa":
                        lock (clientesPessoa)
                        {
                            clientesPessoa.Remove(cliente);
                        }
                        break;
    
                    case "veiculo":
                        lock (clientesVeiculo)
                        {
                           clientesVeiculo.Remove(cliente);
                        }
                        break;
                }
            }

    Como posso controlar o fechamento do Browser para que seja resolvido este problema ?

    Obrigado desde já.


    Atenciosamente, Seratti. Se esta resposta lhe ajudar "marque-a".

    sexta-feira, 5 de julho de 2013 16:16

Respostas