3

ASP.NET と SQL Server を使用して特定の何かを実現したいと考えています。たとえば、いくつかのページがあり、それぞれに独自の ID (つまり、id=1、id=5) があるとします。さらに、これらの ID のそれぞれについて、データベースに行があると仮定しましょう。

つまり、私が達成したいことは次のとおりです。Webソケット(永続的な接続)を利用しながら、データベースの変更を特定のページの特定のクライアントに間接的にプッシュします。

例えば:

行 1:

ID = 1

名前 = 私の名前1

行 2:

ID = 2

名前 = 私の名前 2

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

たとえば、行 1 の列名が 'name1' から 'name2' に変更され、主キーの ID が 5 の場合、id=5 のページにアクセスしたすべての人にクライアント側でイベントを受信して​​もらいたいとします。

Webサービスに要求を論争的に送信し、その特定の行をIDでクエリして、更新されたか、特定の列の値が変更されたかを確認するクライアントコードを開発することを自分自身で防ぎたいと思います。

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

しかし、それはまだ受動的なアプローチです。

それがどのように機能するかを描いてみましょう:

  1. クライアントとサーバーには持続的な接続があります[ASP.NET 4.5 ソケット プロトコルを使用して実行できます]

  2. サーバーは、異なるページからの接続、たとえば id=1、id=2 などの異なるクエリ文字列を持つ接続を区別することを認識しています。私が考えた 1 つのオプションは、それぞれの接続 ID を格納する配列をメモリに作成することです。接続文字列 ID 値。例: {1: 2346,6767,87878, 2:876,8765,3455}。1 と 2 はページの ID (つまり、id=1、id=2) で、他の値は ASP.net 4.5 を使用して取得した永続的な接続の接続 ID です。

  3. 主キー値 id=5 の行の列値の列「カウント」が値「1」から「2」に更新されました。

  4. トリガーは関数を呼び出し、変更された行の ID (値 X と仮定しましょう) を渡します。特定の列の値(選択した列)も送信できることを好みます[これはCLRトリガーを使用して行われます]

  5. 関数には、値 X (数値) の ID を持つページにアクセスしているクライアントの接続のリストがあります。

  6. サーバーはクライアントに列の値を送信します。送信できない場合は、true または false を送信して、その行が変更されたことをクライアントに通知します。

今まで解決した:

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

4] CLRトリガーを使用すると、変更された特定の行の列データとIDを取得する関数を作成できます。

ASP.NET 4.5 を使用してアプリを開発しています。

ありがとう

4

1 に答える 1

1

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

Service Broker は、SQL サーバーでの非同期メッセージングを可能にします。非同期なので、機能を 2 つの部分に分けましょう。

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

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

概念的には、次のように機能します (クライアントは asp.net コードです)。

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

CLR は不要で、データベースの定期的なポーリングも必要ありません。

于 2013-01-26T18:11:31.107 に答える