2009-09-03 115 views
1

我正嘗試使用Compact Framework重新架構在Win CE 5.0設備上運行的程序。現在,應用程序直接與數據庫進行通信,下拉數據,進行更改並將其發送回數據庫。每個客戶端負責通過輪詢數據庫來檢索更新。用於移動設備的客戶端/服務器體系結構(Win CE)

我想要開發更多面向客戶端/服務器的客戶端綁定到服務器,接收數據,將更改發送到服務器,然後將這些更改傳播到其他綁定的客戶端 - 即將接近實時。我正在研究WCF和雙工綁定,但似乎這些功能在.Net CF中是有限的。

任何建議(和例子)將不勝感激。

回答

2

我用於許多Windows-Mobile-客戶端到中央服務器應用程序的體系結構是通過.Net Web服務應用程序調解所有客戶端到中央數據庫的通信。通常,Web服務具有從數據庫獲取數據並將其返回到DataSet中的方法。客戶端應用程序使用此DataSet(顯示和添加,更新和/或刪除記錄),然後將修改後的DataSet傳遞迴Web服務方法,該方法將任何更改保留回主數據庫(DataSet具有許多方便的內置方法這使得這很容易,例如GetChanges())。

如果客戶端應用程序沒有定期連接到Web服務,那麼在本地數據庫中啓用數據保持也相對容易(SqlCE是一個很好的選擇),儘管您的客戶端應用程序會更簡單如果你不必這樣做。無論哪種方式,設計中央數據庫以便將GUID(SQL Server中的uniqueidentifier)用作主鍵非常方便,並且在添加新數據時在客戶端創建密鑰。

將從一個客戶端提交的更改自動發送到所有其他客戶端是更困難的情況。這樣做的最佳方式實際上取決於您的WinCE設備與Web服務之間的連接類型。如果設備基本上始終處於連接狀態,則每當設備啓動時,都可以讓每個設備使用Web服務方法進行「註冊」,然後Web服務會維護已註冊客戶端實例的靜態列表。無論何時從一個客戶端進行更改,Web服務都可以將這些更改「推送」給每個註冊客戶端。

如果設備只是間歇性地連接(就像我曾經寫過的這種類型的每個應用程序一樣),最好堅持使用輪詢概念,並讓每個客戶端應用程序使用Web服務「檢入」分鐘或每30秒或其他)並更新自己與任何未決的變化。實際上,無論如何,這種方法與「推」式架構幾乎沒有區別,並且在實踐中更容易實施並且更可靠。

+0

這些客戶端始終處於連接狀態。我喜歡客戶註冊並向他們推送更新的想法。我正在努力尋找一個如何實現這個例子。 – Josh

+0

@Josh:你想要做的是一個異步調用Web服務的變體。這裏有一個體面的教程關於這個問題:http://ondotnet.com/pub/a/dotnet/2005/08/01/async_webservices.html – MusiGenesis

+0

基本上,「註冊」過程只是客戶端撥打網絡服務方法並傳入一個AsyncCallback,它只是一個委託給客戶端應用程序中的「方法」的方法。在服務器端,您維護來自客戶端的靜態集合(List )中的這些回調。無論何時服務器需要將某些東西「推送」給所有客戶端,服務器端方法遍歷回調的集合,並將必要的數據發送到回調函數,否則只需向每個客戶端發送一條小消息...... – MusiGenesis

相關問題