2010-12-07 128 views
11

我目前正在研究將通過WCF和WCF數據服務通過互聯網與數據庫進行通信的C#.NET桌面應用程序。應用程序中會有許多點需要在一段時間內刷新。最簡單的解決方案是將這些區域放在計時器上並重新查詢數據庫。但是,有數千個客戶端連接到服務層和數據庫,這些操作對於服務器來說是非常昂貴的。良好的C#.NET解決方案來管理頻繁的數據庫輪詢

我所考慮的是創建一個由客戶端輪詢的RSS源,並讓客戶知道何時需要更新這些特定區域。 RSS提要將由一個服務管理,該服務可以輪詢數據庫以進行更改,或者遍歷由客戶端發出的WCF請求排隊的項目列表。

我也考慮過創建一些從客戶端到服務器的直接和連續的連接,但我不確定從客戶端打開哪些出站防火牆端口。我可能只能指望端口80/443。

所以我的問題是有什麼解決方案有人成功實施解決這個問題?有人完成RSS?微軟同步服務?客戶端和服務器之間通過WCF通過一些保存端口進行雙向通信?

任何想法,不勝感激。

回答

8

我想你可能想要結合使用兩種方法。首先,您可以使用從客戶端到服務器的long polling,以便服務器在客戶端感興趣的更改發生後立即通知客戶端。

一種新技術,可以在ASP中很好地處理上述建議。 NET是SignalR。這處理了很多長輪詢的細節(或者在可能的時候使用WebSockets),所以你不必擔心它。

其次,基於這個問題中的標籤,它看起來像你正在使用SQL Server。您可以在您感興趣的表上使用數據庫通知,讓DB在發生更改時通知您的服務。這可能會觸發該服務通過長輪詢連接向客戶端通知有關更改。您可以使用SqlDependency類來完成此操作。

我確定還有其他的方法,但是這可能會很好地擴展,因爲您只有一個服務獲取通知,然後將它們分發給所有客戶端。

+0

+1,但我擔心使用長輪詢的數千客戶端。一些環境優化對於開放連接可能是必需的。我從來沒有這樣做過WCF,所以我不能評論困難/積極因素。 – marr75 2010-12-07 16:23:42

+0

+1你知道C#中使用WCF的任何長輪詢實現嗎?我已經使用了它,並沒有拿出任何好的例子。 – BernicusMaximus 2010-12-07 19:56:37

0

如果昂貴的操作是共享數據庫的服務器,則應該實施某種緩存。它可以像ASP.NET緩存一樣基本,也可以像使用memcached一樣高級。

但是,如果昂貴的操作是客戶端池服務器,則可以使用帶有PubSubHubbub的Atom或RSS源來最小化對服務器的請求數。它會變得更便宜,因爲有一些免費的PubSubHubbub發佈者可以處理負載。

0

你可以看着Service Broker,這樣你就不必輪詢更新

5

可以在WCF連接這樣定義一個回調接口:

[ServiceContract(CallbackContract = typeof(IFooClient))] 

由於客戶端啓動應該通過防火牆工作的連接。該服務器可以方法註冊更改的,你可以用

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>(); 

得到回調接口和回調的所有已註冊的數據更改的客戶端。

0

我不知道爲什麼RSS比使Web服務緩存來自數據庫的信息更簡單。

要比較2個選項,假設您需要知道誰最後在報表中編輯了對象(或上次更新等)。使用RSS提要時,您必須提出Feed的請求,獲取它,解析它,並根據相關值採取措施。通過一個Web服務調用來緩存和緩存數據庫調用,您只需調用服務並對結果採取行動。我唯一能看到RSS更好的是,1)你支持多個客戶,或者你不控制或者不是.Net客戶,2)你基於大量的被調查值同時採取行動。

相關問題