我是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!"));
}
好。我知道了!这个问题的答案很简单:
当您订阅服务时,您需要保存某个位置(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
}
希望这可以帮助!