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

时间:2013-07-24 15:20:10

标签: wcf callback

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

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

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

如何保存回调实例?

非常感谢。

佩德罗

CODE:

//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!"));
                }

1 个答案:

答案 0 :(得分: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
 }

希望这可以提供帮助!