2010-11-30 116 views
16

我有一個帶有net.tcp DuplexChannel的WCF自託管服務。在服務器上我運行下面的斷開客戶端:WCF:如果服務器斷開連接,我如何檢測客戶端

((ICommunicationObject)client.CallbackChannel).Close(); 

這工作得很好,但我怎麼在客戶端上檢測到它已斷開連接?

伊夫迷上了封閉式和斷陷事件的回調均的InstanceContext和通道到服務器:

InstanceContext callback = new InstanceContext(callbackImp); 
callback.Closed += new EventHandler(callback_Closed); 

((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed); 

但沒有任何工程。我從未收到通知。現在使用的解決方法是在回調中使用一種方法,而不是從客戶端觸發斷開連接。但我寧願不這樣做。我特別不想讓服務器等待用戶斷開連接。

EDIT

我剛剛意識到從客戶端斷開時,我運行在服務合同的方法,其標有IsTerminating =真:

[OperationContract(IsTerminating = true)] 
void Disconnect(); 

我想這將是在回調合同上呢?我嘗試添加同樣的方法來我的回調和它沒有終止從服務器的角度來看,回調通道,但我仍然didnt上的客戶端得到通知......怪異

編輯

我發現了一些這方面的詳細信息:

當服務器中止回調 通道,故障旅行回到 客戶端,客戶端故障,我們得到 在客戶端上發生故障的事件。

當服務器關閉回調 通道時,會話仍然打開 ,直到客戶端發出關閉。

客戶關閉頻道 後,您會看到Closed事件。

根據這條語句,關閉事件並不是通過關閉服務器的回調通道來觸發的,客戶端也必須關閉它。所以我可以在回調的終止Disconnect方法中在客戶端運行Close。或者我可以在回調服務器端使用Abort-method,並在回調中使用Disconnect方法。我不知道我坦率地說哪一個。 Hmmmm。

編輯

我去中止的方法。這似乎是最合乎邏輯的方法,它的運作非常好。客戶端通過回調-conceptcontext上的Faulted事件得到通知。尼斯。

+0

看看這個我有同樣的問題http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev 2011-02-26 08:53:45

回答

2

我去中止的方法。這似乎是最合乎邏輯的方法,它的運作非常好。客戶端通過回調-conceptcontext上的Faulted事件得到通知。

1

您可以在關閉回叫通道之前簡單地做一個回調,告訴客戶您正在關閉通道。

因此,只要這行代碼之前:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

這不起作用 – Sentry 2017-09-28 16:32:37

相關問題