2013-07-24 94 views
0

我是新來的stackoverflow,但我每天都用它。今天我需要你,因爲我沒有得到這個信息。wcf回調+保存會話不操作上下文

我的問題是: 我想爲客戶端提供回調服務,但我不想回調他們在服務中調用的函數。 (類似訂閱者/發佈者) 我想保存回調實例。 然後我想要一個服務在我的服務中調用一個函數來觸發回調(如:callbacks.PrintMessage(「Message」));) 將回調實例保存在靜態類的靜態列表中。

當調用callback.function()即時得到這個錯誤:「您正在使用釋放的對象」 因爲即時得到這個實例:OperationContext.Current.GetCallbackChannel <「回調接口」>

能有什麼我確實保存了回調實例?

非常感謝。

佩德羅

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

您能否發表評論? – GrandMasterFlush

+0

對不起,我不習慣Stackoverflow,所以代碼標識不如我想要的那樣。我想你問的是在那裏,我想你可以理解。謝謝。 – cyp

回答

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 
} 

希望這可以幫助!

Pedro