我一直有问题,但到目前为止还没有解决方案,我希望你能帮助我。
我有一个Silverlight应用程序,我使用WCF进行查询以从数据库中检索信息,也用于客户端(Duplex)和Socket之间的通信(在我的应用程序和其他人之间接收和发送信息)。
要控制Duplex,当客户端访问我的应用程序的特定模块时,我将该客户链接到我在Projeto.Web(应用程序启动)上的静态类,如下面的代码所示:
//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;
}
}
当我对数据库进行更改时,所有位于更改WCF服务的接收模块的在线客户都使用以下代码:
//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);
}
}
}
我的问题发生在我通过Socket(位于projeto.Web中的类)获取一些信息时,它创建了我的ServicoWCF实例并调用该方法将接收到的信息发送给客户端。显然,我的静态变量在应用程序的这一侧被调用时被重置。
我称之为服务的“哪一方”有什么不同吗?当我在WCF客户端调用它时,我的静态变量得到正确的计数,但是当我在Socket类上调用它时,count被设置为0。
我希望你能帮助我,我尽量保持清醒,如果有任何疑问请告诉我。
提前致谢!