2009-09-03 8 views
1

Compact Frameworkを使用してWindows CE 5.0デバイス上で動作するプログラムを再構築しようとしています。現在、アプリケーションはデータベースと直接通信し、データをプルダウンしたり、変更したり、データベースに戻したりします。各クライアントは、データベースをポーリングすることによって更新を取得します。モバイルデバイス用のクライアント/サーバーアーキテクチャ

クライアントがサーバーにバインドされ、データを受信し、サーバーに変更を送信し、その変更を他のバインドされたクライアントに伝播するような、クライアント/サーバー指向のものを開発したいと思います。私はWCFとデュプレックスバインディングを見ていましたが、これらの機能が.NET CFで制限されているかのようです。

ご意見(と例)をいただければ幸いです。

答えて

2

私がWindows-Mobile-clients-to-central-serverアプリケーションの多くで使用したアーキテクチャは、.Net Webサービスアプリケーションを使用して、すべてのクライアントから中央データベースへの通信を仲介することです。一般に、Webサービスには、データベースからデータを取得し、それをDataSetに返すメソッドがあります。クライアントアプリケーションは、このDataSet(レコードの表示と追加、更新、削除)を行った後、変更されたDataSetをWebサービスメソッドに渡して、メインデータベースに変更を反映します(DataSetには、これは、例えば、GetChanges()のように簡単です)。

クライアントアプリケーションがWebサービスと定期的に接続していない場合は、ローカルデータベース(SqlCEはこれには優れた選択肢です)でデータを永続化することも比較的簡単ですが、クライアントアプリケーションは非常に簡単ですあなたがこれをする必要がなければ。どちらの方法でも、主データベースとしてGUID(SQL Serverのユニーク識別子)を使用するように中央データベースを設計し、新しいデータが追加されるたびにクライアント側でキーを作成するのは非常に便利です。

クライアントから送信された変更を自動的に他のすべてのクライアントに送信することは、より困難な状況です。これを行う最善の方法は、WinCEデバイスがどのような種類の接続性をWebサービスと持っているかに大きく依存します。デバイスが本質的に常に接続されている場合、起動するたびに各デバイスにWebサービスメソッドを本質的に「登録」させることができ、Webサービスは登録されたクライアントインスタンスの静的リストを保持します。あるクライアントから変更が入った場合、Webサービスはこれらの変更を登録された各クライアントに「プッシュ」できます。

デバイスが断続的に接続されている場合(私がこれまで書いたこのタイプのすべてのアプリのように)、ポーリングのコンセプトを守り、各クライアントアプリケーションにウェブサービス30秒ごとなど)、保留中の変更で自身を更新します。実際には、このアプローチは、とにかく「プッシュ」アーキテクチャとほとんど区別できず、実装が簡単であり、実際にはより信頼性があります。

+0

これらのクライアントは常に接続されています。私は、顧客が更新を登録し、それらに更新を送り出すという考えが好きです。私はこれを実装する方法の例を見つけるのに苦労しています。 – Josh

+0

@Josh:あなたがしたいのは、非同期的にWebサービスを呼び出す変形です。ここでは、主題に関するまともなチュートリアルです:http://ondotnet.com/pub/a/dotnet/2005/08/01/async_webservices.html – MusiGenesis

+0

基本的に、「登録」プロセスは、クライアントがWebに電話をかけているだけですAsyncCallbackを渡します.AsyncCallbackは、クライアントアプリケーション内に存在するメソッドへの代理人に過ぎません。サーバー側では、これらのコールバックを静的コレクション(List )内のクライアントから維持します。サーバーがすべてのクライアントに何かを「プッシュ」する必要があるときは、サーバーサイドのメソッドはコールバックのコレクションを繰り返し、必要なデータをコールバックに送信するか、小さなメッセージを各クライアントに送信します。 – MusiGenesis

関連する問題