Inquiridor
Classe estática no projeto .Web

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