none
Classe estática no projeto .Web RRS feed

  • Pergunta

  • Olá pessoal,

    Estou com um problema faz um bom tempo, porém até agora não consegui uma solução e espero muito que vocês possam me ajudar.

    Tenho uma aplicação Silverlight no qual utilizo WCF para consultas ao banco de dados e comunicação entre os clientes (Duplex) e Socket, para recebimento e envio de informações entre a minha aplicação e outras.

    Para controlar o Duplex, quando o cliente acessa um módulo especifico da minha aplicação, eu vinculo aquele cliente em uma classe estática que tenho no meu Projeto.Web (start Application), como no código abaixo:

    //static Class
        public static class ncClientes
        {
            private static List<IncServicoDuplex> clientesSupRecAlarme = new List<IncServicoDuplex>();
            public static List<IncServicoDuplex> ClientesSupRecAlarme
            {
                get { return ncClientes.clientesSupRecAlarme; }
                set { ncClientes.clientesSupRecAlarme = value; }
            }
        }

    //Método chamado pelo WCF quando o cliente acessa o módulo
    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 "ncPrincipal|Alarme":
                    case "ncAlarme":
                    case "ncConfiguracao|Supervisao":
                        lock (ncClientes.ClientesSupRecAlarme)
                        {
                            ncClientes.ClientesSupRecAlarme.Add(cliente);
                        }
                        break;
                }
            }

    Quando eu faço uma alteração no banco de dados, todos os meus clientes online que estão naquele módulo recebem essa alteração pelo Serviço WCF, como no código abaixo:

    //Método no meu WCF que transmite a informação de alteração, inclusão ou exclusão de um cliente para os outros
    public void SupervisaoAlarmeOnline(ncAlarme objAlarme)
            {
                var varClientesAlarme = new List<IncServicoDuplex>(ncClientes.ClientesSupRecAlarme);
    
                foreach (var item in varClientesAlarme)
                {
                    try
                    {
                        item.SupervisaoAlarmeOnlineRetorno(objAlarme);
                    }
                    catch
                    {
                        ncClientes.ClientesSupRecAlarme.Remove(item);
                    }
                }
            }

    O meu problema acontece quando eu recebo uma informação pelo Socket (classe localizada no projeto.Web) que cria uma instancia do meu ServicoWCF e chama o método para enviar a informação recebida para os clientes, porém, a minha variável estática, quando chamada deste lado da aplicação, está zerada, sendo que há clientes online e no módulo no qual deveria receber esta informação.

    Há diferença de "qual lado" eu chamo o método do serviço? Pois quando chamo o WCF do lado cliente, a minha variável estática contém o count correto, porém quando chamo da classe do Socket, localizada no projeto.web, a minha variável está com count 0.

    Espero que vocês possam me ajudar, tentei ser o mais claro possível, caso haja necessidade de mais informações, postem que logo em seguida respondo!

    Obrigado desde já!!


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

    segunda-feira, 9 de dezembro de 2013 19:29

Todas as Respostas

  • Alguém para dar uma força??

    Somente para tentar ser mais claro, faltou eu postar a classe que recebe mensagem do Socket e envia para os clientes online.

    //Class that receive the socket message from other application and call the Service to send to all users online
            ncServico svcOnline;
            private void RecebeMensagemSocket(IAsyncResult iar)
            {
                Socket recvSock;
                EndPoint clientEPNEW;
    
                try
                {
                    //Get the received message.
                    recvSock = (Socket)iar.AsyncState;
                    EndPoint clientEP = recvSock.LocalEndPoint;
    
                    int tamMsg = recvSock.EndReceiveFrom(iar, ref clientEP);
    
                    string str = Encoding.Default.GetString(data, 0, tamMsg);
    
                    svcOnline.SupervisaoAcessoOnline(listAcesso[0]);
                }
            }

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

    sexta-feira, 13 de dezembro de 2013 15:52