我已经设法创建了一个带回调的WCF服务。回调按预期工作,但只针对一个客户端。如果启动另一个客户机,第一个客户机将停止接收回调,但第二个客户机将接收回调两次,以此类推。我已经尝试过InstanceContextMode
在单一,PerCall和个人模式,但它导致同样的问题。
你知道怎么解决这个问题吗?
服务类:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]
public class HostFunctions : IHostFunctions
{
#region Implementation of IHostFunctions
public static IHostFunctionsCallback Callback;
public static Timer Timer;
public void OpenSession()
{
Console.WriteLine("> Session opened at {0}", DateTime.Now);
Callback = OperationContext.Current.GetCallbackChannel<IHostFunctionsCallback>();
Timer = new Timer(1000);
Timer.Elapsed += OnTimerElapsed;
Timer.Enabled = true;
}
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
if (Callback != null)
{
Callback.OnCallback();
}
}
#endregion
}
这是回调类:
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public class Callback : IHostFunctionsCallback
{
#region Implementation of ICallback
public void OnCallback()
{
Console.WriteLine("> Received callback at {0}", DateTime.Now);
}
#endregion
}
我觉得静态存在问题,因为您在静态中存储回调引用。回调引用包含与它回调的客户端相关的信息。
导致第一个客户端在第二个客户端注册时错过它。
更多信息:多个客户端的WCF回调