2013-05-10 52 views
1

我使用WCF實現了發佈者 - 訂閱者機制。WCF回調通道異常終止

我這是怎麼認購回調:

public delegate void AsyncResponseEventHandler(AsyncResponse asyncResponse); 
public static event AsyncResponseEventHandler AsyncResponseEvent;  
public static IMyEvents Subscriber;   
public void SubscribeEvent()   
{    
Subscriber = OperationContext.Current.GetCallbackChannel<IMyEvents>();    
AsyncResponseEvent += new AsyncResponseEventHandler (Subscriber.AsyncResponseCallBack);   
}   
public static void RaiseAsyncResponse(AsyncResponse asyncResponse)  
{   
    try 
      {     
     AsyncResponseEvent.Invoke(asyncResponse); 
      }    
catch (Exception ex) {throw;}  
}  

而且這是MySubscriber類代碼:

 public class MySubscriber : IMyEvents 
    { 


public void AsyncResponseCallBack(AsyncResponse asyncResponse) 
     { 

      AsyncResponseEventArgs e = new AsyncResponseEventArgs() 
      { 
       Response = asyncResponse 
      }; 
      OnAsyncResponseReceived(this, e); 

     } 
    } 

我用RaiseAsyncResponse方法來提高回調到客戶端,

時服務主機是Windows服務,我啓動服務,我開始調試,一切工作正常,但當我停止客戶端應用程序並重新啓動調試與重新啓動Windows服務,我面臨的例外:通信對象,System.ServiceModel.Channels.ServiceChannel,不能用於通信,因爲它已被中止...

爲什麼回調通道被中止? 請幫我... :(

回答

1

因爲「但是當我停止客戶端應用程序」就是答案。不久你停止客戶端應用程序,System.ServiceModel將釋放通道上的暫停。發送服務的數據到客戶端,反之亦然,如果你殺了服務或客戶端。

+0

謝謝你的答案...所以我的問題是基於nettcpbinding如何工作的回調,我怎麼能實現雙工消息模式如果我重新啓動客戶端,我不需要重新啓動服務? – 2013-05-11 03:55:34

+2

首先,您隨時可以在客戶端調用函數時獲取客戶端的回調通道,否則您需要將回調通道存儲在字典中。然後,當客戶啓動時,它應該打一個服務電話給「註冊「它是回調通道。然後服務可以隨時使用它。在該服務調用中,訂閱ChannelClosed事件,並在客戶端斷開時刪除該頻道。當您重新啓動客戶端時,它應該再次調用該服務來註冊其回調。 – Jeff 2013-05-13 13:32:48

+0

非常感謝你;) – 2013-05-14 06:18:59