2014-05-08 71 views
0

我有一個WCF客戶端需要關閉其與服務器的連接,以防未有超過X秒的呼叫時間。 我的服務器有很長的inactivityTimeout我不能改變(我可以做的唯一的變化是在客戶端的一側)手動跟蹤WCF客戶端的不活動時間

閱讀我明白,我不能爲了做到這一點使用WCF's配置後,所以我想跟蹤時間在我的客戶端手動進行的呼叫之間。 如果客戶端未超過X秒的呼叫,我將關閉該連接。

我認爲有2種方法來實現它,但我不喜歡它們中的:

  1. 添加一些代碼,以我的全部功能,將節省通話時間。

  2. 使用IClientMessageInspector - 在這種情況下,我需要將呼叫的時間發送到一個外部類,該類將保存這些數據,並且如果它識別到服務器的呼叫尚未已經做了X秒。

我期待像將調用每個調用服務器的事件一個簡單的解決方案,這樣的時間跟蹤斷開所有的邏輯將在同一類(WCF's客戶端代碼)或發生可能需要使用WCF's配置的某種方式,以便在X秒以上不活動的情況下自動關閉連接。

我使用的綁定是netTcpBinding關於如何實現它reliableSession

任何想法?

+0

爲什麼要在通話之間保持會話打開?理想情況下,您可以在每次通話後關閉連接。 – PatFromCanada

+0

系統中有一部分我無法更改,這部分還使我保存一個公開會話,直到我的客戶關閉應用程序。 我遇到的問題是我無法知道客戶端什麼時候關閉了應用程序,因此如果它已經閒置超過X秒,我正試圖關閉連接。 – Shay

回答

0

我幾乎總是有一個方法,返回一個開放服務客戶端的參考GetMyService。這樣我就可以在一個地方實例化和打開服務的邏輯,主要是我可以可靠地在開發,測試和生產環境之間切換端點。在我的設置中,使服務調用關閉服務的方法,但是如果你離開它,你會得到你的解決方案。

有一個方法可以返回服務客戶端並保存對它的引用。如果服務關閉,它將打開該服務,在下次調用該方法時,它只返回打開的服務客戶端。然後,您只需創建一個計時器即可關閉該服務,並在每次調用GetService方法時重置該計時器。

我無法想象一個場景,您需要保持連接打開,但可以關閉它「威利尼利」。除非你打開連接時需要通過某種狀態?在這種情況下,我的解決方案更有意義。我仍然懷疑你不需要保持連接暢通。否則隨機關閉它,因爲用戶去喝咖啡會破壞它。

+0

感謝您的回答。但我不能在我的解決方案中使用它。 我正在寫的服務是從一側連接到WCF netTcpBinding,並將另一側連接到REST服務。 此服務的目的是保持與NetTcpBinding的連接,只要REST客戶端正在使用它。 如果REST客戶端沒有在X秒內撥打電話,我想關閉與netTcpBinding的連接。 我知道這不是「最好」的架構,但我無法改變它。 – Shay

+0

只是供參考您的意見不是很有用,你說你不能使用我的答案,但沒有理由,你再說一次,你需要保持連接打開,但你不給理由。您似乎也可以互換地使用「客戶端」和「服務」。 – PatFromCanada