2009-11-05 33 views
1

使用如在暗示:WCF服務器推送連接測試。中國平安()?

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.callbackcontract.aspx

我實施ServerPush設置爲我的API從事件服務器(無投票)獲得實時通知。基本上,服務器有一個RegisterMe()和UnregisterMe()方法,客戶端有一個名爲Announcement(字符串消息)的回調方法,通過WCF中的CallbackContract機制,服務器可以調用。這似乎運作良好。

不幸的是,在這個設置中,如果服務器崩潰或者不可用,客戶端將不知道,因爲它只能監聽消息。線路上的沉默可能意味着沒有公告,也可能意味着服務器不可用。

因爲我的目標是減少輪詢而不是即時性,所以我不介意在服務器上添加一個無效的Ping()方法,而RegisterMe()和UnregisterMe()僅用於測試服務器的連接。我相信定期測試這種方法會確保我們仍然連接(並且因爲這是TCP,所以沒有公告已被丟棄),因爲這是TCP。)

但是Ping()方法是必需的還是這種連接性測試在默認情況下作爲WCF的一部分提供 - 例如serverProxy.IsStillConnected()或其他東西。據我瞭解,頻道的狀態只會在失敗的Ping()後返回Faulted或Closed,而不是取而代之。

2)從更廣泛的角度來看,這種回調方式是否穩固?這不適用於http或ajax - 連接的客戶端數量很少(幾十個客戶端,最多)。這種方法是否存在嚴重問題?由於這似乎是一個輕微的風險,我怎樣才能限制緩慢/惡意客戶端阻止服務器不處理它的回調隊列足夠快?是否有一種特定於回調的超時時間,可以在不影響其他操作的情況下進行設置?

回答

2

你的方法聽起來很合理,這裏有一些鏈接,可能會或可能不會幫助(他們是不是很確切相關):

Detecting Client Death in WCF Duplex Contracts http://tomasz.janczuk.org/2009/08/performance-of-http-polling-duplex.html

有內置到應用程序協議的一些健康檢查是有道理的。

如果您擔心惡意客戶,請添加授權。

我上面分享的第二個鏈接有一個示例發佈/訂閱服務器,您可以使用此代碼。有幾件事值得注意 - 考慮通過異步調用或單獨的線程推送通知。並在tcp綁定上設置sendTimeout。

HTH

+0

謝謝!這是一個很好的答案。由於這個問題需要部分的意見,所以我想再補充一點,所以我要把它放開。但迄今爲止+1。 – 2009-11-09 17:26:23

+0

您還可以將回調操作標記爲「單向」,而不用擔心客戶端在其回調方法中執行的操作。 – thewpfguy 2013-03-13 09:54:36

1

我寫了一個WCF應用程序,遇到了類似的問題。我的服務器檢查客戶端沒有通過定期向他們發送ping來「插入」。實際的發送方法(它是異步的服務器)有30秒的超時時間。客戶端簡單地檢查它每隔30秒收到一次數據,如果達到超時,服務器將捕獲異常。

需要授權才能連接到服務器(通過使用WCF的內置功能,強制連接人員首先調用特定的方法),所以從惡意客戶的角度來看,您可以輕鬆添加代碼來檢查並禁止它們如果他們做了可疑的事情,則將其帳戶關閉,同時斷開沒有進行身份驗證的用戶。

由於我寫的服務器是異步的,所以沒有辦法真正阻止它。我想這就解決了你的最後一點,因爲異步發送方法會觸發ping(以及任何其他數據發送)並立即返回。在SendEnd方法中,它會捕獲超時異常(有時爲客戶端的多個異常)並斷開它們,而不會阻塞或凍結服務器。

希望有所幫助。

1

你可以使用一個類似的Juval提出了一個發佈/訂閱服務: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

這將讓你堅持的用戶,如果失去了服務器是一個典型的場景。在這個例子中的發佈方法也調用每個用戶在一個單獨的線程,所以一些死的用戶不會阻止其他人...