wcf回调+保存会话而不是operationcontext

问题描述 投票:0回答:1

我是stackoverflow的新手,但我每天都使用它。今天我需要你,因为我在任何地方都没有这个信息。

我的问题是:我想通过回调客户端来提供服务,但我不想回调他们在服务中调用的函数。 (像订阅者/发布者)我想保存回调实例。然后我想要一个服务调用我的服务中的一个函数来触发回调(如:callbacks.PrintMessage(“Message”));)将回调实例保存在静态类的静态列表中。

当调用callback.function()我得到这个错误:“你正在使用Disposed对象”因为我得到了这个实例:OperationContext.Current.GetCallbackChannel <“callback interface”>

我该怎么做才能保存回调实例?

非常感谢。

佩德罗

码:

//FUNCTION IN MY SERVICE
        public void Subscribe()
                {
                   var callback = OperationContext.Current.GetCallbackChannel<IMonitoringWebServiceCallback>();
                    callbacks.Add(callback);

                    callback = OperationContext.Current.GetCallbackChannel<IMonitoringWebServiceCallback>();


                    AlarmCallbackSingleton.Instance.AddCallback(callback);

                    //callback.PrintString("String"); //HERE IT WORKS! BUT I DONT WANT CALL HERE!

                    alarmInfoHandler = new AlarmInfoEventHandler(AlarmInfoHandler);
                    NewAlarmInfo += alarmInfoHandler;
                }

    //FUNCTION IN THE SAME SERVICE CALLED BY OTHER CLIENT
         public void PublishAlarm(string alarm)
                {
                    AlarmInfoEventArgs e = new AlarmInfoEventArgs();
                    e.Alarm = alarm;
                    NewAlarmInfo(this, e); 
                }

        public void AlarmInfoHandler(object sender, AlarmInfoEventArgs e)
                {
        List<IMonitoringWebServiceCallback> callbacks = AlarmCallbackSingleton.Instance.GetCallbacks();

    //EVERYONE THAT SUBSCRIBED SHOULD EXECUTE THIS (HERE I GET THE DISPOSED ERROR)
                    callbacks.ForEach(x => x.ShowString("String!"));
                }
wcf callback
1个回答
0
投票

好。我知道了!这个问题的答案很简单:

当您订阅服务时,您需要保存某个位置(List等..)OperationContext而不是回调对象。然后,当另一个客户端调用PublishAlarm时,事件被触发,您需要获取订阅的所有客户端的OperationContext。我将objetcs保存在静态列表(单例类)中仅用于示例。

然后:

 public void AlarmInfoHandler(object sender, AlarmInfoEventArgs e)
 {
    var operation = AlarmCallbackSingleton.Instance.operationContext
    var callback = operation.GetCallbackChannel<IMonitoringWebServiceCallback>();
    callback.ShowAlarm(); //function you want to call
 }

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.