2012-05-13 11 views
3

ASP.NETとSQL Serverを使用して具体的なものを実現したい。たとえば、私は各ページにそれぞれの識別情報(すなわち、id = 1、id = 5)があるとしましょう。さらに、これらのIDのそれぞれについて、データベースに行があるとします。SQL Serverの列または行の更新に基づいて特定のページのクライアントにデータを送信

要するに、私が達成したいのは、データベースの変更を特定のページの特定のクライアントに直接プッシュすることですWebソケット(永続的接続)。例えば

行1:

ID = 1

名= myname1

行2:

ID = 2

名前= myname2

私がしたいことは、特定の行または列内の特定の値が変更されたときに、そのページを訪れているクライアントにのみ特定のデータを送信できるイベントがトリガーされることです変更された特定のIDで

たとえば、行1の列名が 'name1'から 'name2'に変更され、主キーのIDが5の場合、id = 5のページにアクセスするすべてのユーザーにクライアント側。

webサービスにリクエストを送信し、特定の行をidで照会して、更新か特定の列の値が変更されたかどうかを調べるクライアントコードを開発しないようにします。

私が考えていたのは、キー/値がメモリ内に保持されている(つまりmemcache)キーがIDを表していて、値が更新されたdatetimeを表しているということでした。次に、私はメモリを照会することができます。たとえば、[5、05/11/2012 12:03:45]の場合、クライアント側でメモリに最後にクエリを保存してデータが最後に更新されたかどうかを知ることができます。日付を比較する。クライアントのdatetime値がメモリ内のkey/valueの値よりも古い場合は、データベースを再度照会します。

しかし、まだパッシブなアプローチです。

、それがどのように動作するかを、私はそれを描画してみましょう:

  1. クライアントとサーバが永続的な接続を持って

  2. Serverが区別するために知っている[ASP.NET 4.5のソケット・プロトコルを使用して行うことができます] id = 1、id = 2などの異なるクエリ文字列を持つものなどです。私が考えていた1つのオプションは、各接続文字列id値の接続IDを格納するメモリ内の配列を作成することでした。例:{1:2346,6767,87878,2:876,8765,3455} 1と2はページのIDです(つまりid = 1、id = 2)。その他の値は、ASP.netを使用して取得した固定接続の接続IDです。4.5

  3. 行の列の値主キー値id = 5の列 'count'は値 '1'から '2'に更新されます。

  4. トリガは関数を呼び出し、変更された行のid(値Xと仮定)を渡します。私は、関数がでページを訪問しているクライアントに対して、接続のリストを持っている

  5. [これはCLRトリガーを使用して行われている] も(私の選択のいくつかの列)を特定のカラムの値を送信することができることを好みますサーバーがクライアントに列値を送信するか、可能でない場合はtrueまたはfalseを送信して、その行への変更が行われたことをクライアントに通知します。

は今まで解決:

1] ASP.NET 4.5を使用して行うことができますソケットプロトコル

4]私は、列のデータを持つようになる機能を持たせることができるトリガCLRを使用します変更された特定の行のID。

私はASP.NET 4.5を使用してアプリケーションを開発しています。

ありがとうございます。

+1

.NET 4.5にはWebソケットプロトコルのヘルパーがいくつか用意されています... http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097383 – McGarnagle

+0

WebSocketは私を助けませんデータが変更されたかどうかを知る必要があるからです。WebSocketはデータをクライアントに転送するのに役立ちますが、特定のページ(つまり、id = 5)にあるデータにデータを転送するのに役立つソリューションを見つける必要があります。さらに、変更された行主キーIDを引数としてトリガされた関数に送るある種のトリガメカニズムが必要です。 –

+1

CLRトリガー? http://msdn.microsoft.com/en-us/library/ms131093(v=sql.105).aspx – McGarnagle

答えて

1

Sql Server Service Brokerは、要件のかなりの部分を達成できます。

Service Brokerでは、SQL Serverで非同期メッセージングが可能です。非同期であるため、機能を2つの部分に分割します。

最初の部分は、サービスブローカキューにメッセージを書き込むテーブルのトリガです。これはまっすぐなT-SQLであり、かなり単純です。メッセージのペイロードは、varbinary(max)に変換できるものです。 xml、カンマ区切りの値を含むvarchar(100)、またはその他の表現が可能です。

2番目の部分はメッセージの処理です。 transact-sqlのRECEIVE文を発行して、キューから次のメッセージを取得します。このステートメントは、何かが到着するまでブロックします。キューは複数の会話を持つことができるため、各クライアントは独自の通知を受け取ります。

概念的には、それが(クライアントがasp.netコードである)このように仕事ができる:

  1. クライアントは、Service Brokerの会話を開きます。
  2. クライアントはテーブルの上に受け取る無期限にブロック
  3. UPDATEの変更データページ用= 3
  4. トリガーは、すべての会話にメッセージを送信しない
  5. )「私はページ= 3に興味があるというメッセージを送信それは、クライアントがメッセージを受信= 3
  6. ページに興味があり、Webブラウザに更新されたデータを送信します。

んCLR必要な、データベースの定期的なポーリング。

関連する問題