2013-06-04 22 views
1

我試圖讓當客戶端的一個斷開我的服務知道觸發事件。C# - WCF複式=>當客戶端斷開

我正在使用wsDualHttpBinding。

目前,我試圖用這個事件:

OperationContext.Current.Channel.Closed += new EventHandler((sender, e) => ClientIsDisconnected(sender, e, currentCallbackChannel)); 

但此事件從來沒有發射...

請幫我知道它會怎麼做!

編輯:

由於anderhil,終於通過NetTcpBinding的替換wsDualHttpBinding(與這裏描述的相應的配置:http://msdn.microsoft.com/en-us/library/ff647180.aspx#Step1)。

有了NetTcpBinding的,沒有任何問題的封閉事件觸發......不過不知道爲什麼,但它的工作原理。

+0

所以您沒有收到該事件甚至一度?你如何測試它? 你在哪裏使用你的代碼?(在什麼操作中)爲什麼你需要雙工? – anderhil

+0

不,我還沒有收到它。我通過退出我的一個客戶端WinForm來測試它。當我的一個客戶端連接到服務時,我附加了EventHandler,之後我將當前的CallbackChannel註冊到了一個頻道列表。我需要雙工來讓每個客戶知道何時斷開其他客戶端。 – Oliboy50

+0

我編輯了我的問題,用更多的代碼。 – Oliboy50

回答

1

您遇到的問題可能是監守WsDualHttpBinding的。如果您有此綁定,則會創建兩個連接,從客戶端到服務以及從服務到客戶端。

當應用程序通過互聯網部署時,它可能會在支持這些應用程序時產生一些問題,您需要確保人員不在防火牆或NAT等後面,這可能會阻止您的服務連接回客戶端。

我仍然不知道爲什麼測試時它不會在本地機器上工作,但我將盡力解決它,並更新了答案。

當你告訴我更多的細節在我們的聊天,從你的應用程序的性質,它是更好地使用NetTcpBinding的。在這種情況下,更容易瞭解發生了什麼情況會導致創建一個連接,並且如果發生優化關閉或客戶端中止,您將收到通知。

我曾告訴過你,反正這是更好地創建一些心跳機制有東西在意想不到的計算機或路由器關機的情況下更可靠。

此外,你可以找到關於如何選擇涉及各方WCF之間的通信這個好小抄:

wcf binding cheat sheet

1

Closed事件應在優美斷開發生;這是怎麼回事? 爲了檢測純插座斷開連接,偵聽Faulted事件:

OperationContext.Current.Channel.Faulted += new EventHandler(FaultedHandler); 
+0

事實上,我試了兩種...如何確定事件是否被解僱?我在函數ClientIsDisconnected中放置了Console.WriteLine(「blabla」)。但我甚至不確定我是否可以在服務輸出中看到它... – Oliboy50

+1

要調試服務,請附加到它;好的指示是[這裏](http://stackoverflow.com/a/4710758/55487) – Geoff

+0

哼哼......似乎我的服務已經附上了..你能給我一個關於我應該如何使用這個事件的例子,也許我做錯了。 – Oliboy50