Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF回调不适用于多个客户端_C#_Wcf_Wcf Callbacks - Fatal编程技术网

C# WCF回调不适用于多个客户端

C# WCF回调不适用于多个客户端,c#,wcf,wcf-callbacks,C#,Wcf,Wcf Callbacks,我已经设法创建了一个带有回调的WCF服务。回调按预期工作,但只针对一个客户端。 如果我启动另一个客户端,第一个客户端停止接收回调,但第二个客户端接收回调两次,以此类推。 我曾尝试在Single、PerCall和PerSession模式下使用InstanceContextMode,但它导致了相同的问题 你知道如何解决这个问题吗 以下是服务类: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextM

我已经设法创建了一个带有回调的WCF服务。回调按预期工作,但只针对一个客户端。 如果我启动另一个客户端,第一个客户端停止接收回调,但第二个客户端接收回调两次,以此类推。 我曾尝试在Single、PerCall和PerSession模式下使用
InstanceContextMode
,但它导致了相同的问题

你知道如何解决这个问题吗

以下是服务类:

[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
    }

我觉得在静态中存储回调引用时,静态存在问题。回调引用包含与其回调的客户端相关的信息

这导致第一个客户机在第二个客户机注册时错过了它


更多信息:

我觉得静电干扰存在一些问题。您将引用存储在静态中以便回调。谢谢,这些链接看起来非常有用。顺便说一句,这段代码来自这里的教程:编辑:我不知道我是否需要发布/订阅模型,因为我只需要“订阅”(添加回调引用),然后从数据库读取一些数据并将其发送到相应的客户端。@dotnetstep请回答您的评论。删除
static
修复了该问题。
[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
    }