8

新しい通知を受け取ったときにユーザーに通知する必要があるアプリケーションに取り組んでいます。アプリケーションはAzureでホストされ、.NET MVC 3になります(おそらく重要ではありませんが、参考までに)。私も

通知はMSSQLデータベース(2008)に保存され、IsReadフィールドがあります。通知は、さまざまなユーザーおよびサーバーのアクションから生成されます。ユーザー設定に基づいて、一部の通知はで作成されIsRead == falseます。

SignalRの処理には完璧だと思う、2つの異なるシナリオがあります。少しのガイダンスが必要です。

  1. ユーザーはサイトを閲覧するためにいくつかのウィンドウを開いており、そのユーザーに割り当てられた新しい通知行が追加され、IsRead == true
    • すべての特定のユーザーのブラウザインスタンスに、通知ポップアップを表示するために呼び出される特定のjs関数を持たせたい
  2. ユーザーはいくつかのウィンドウを開いており、通知ポップアップをクリックします。
    • すべての特定のユーザーのブラウザインスタンスに、通知ポップアップを削除するために呼び出される特定のjs関数を持たせたいです。(クリックを処理した特定のブラウザインスタンスのみがjs関数を実行して、通知の詳細を表示します)

私が試したこと


最初のシナリオでは、通知がデータベースに書き込まれるのと同じアクションが、すべてのユーザーのブラウザーインスタンスに通知する責任があると思います。

2番目のシナリオは、ポップアップをクリックすることでサーバーエンドポイントがAjax経由で呼び出され、そのエンドポイントがデータベースを更新して通知を既読としてマークし、他のすべてのユーザーのブラウザーインスタンスに通知するという点で似ています。

ASP.NETフォーム認証ユーザー名に基づいてSignalRクライアントを追跡する方法があれば、それは両方のシナリオの問題を解決するのに役立つと思います。

TL; DR


私の主な問題は、SignalRを使用して特定のユーザーのブラウザインスタンスすべてに信号を送る方法がわからないことです。ASP.NETフォーム認証ユーザー名に基づいてグループを作成することを考えていました。これは機能しますか?これを処理するSignalRに組み込まれているより簡単な方法はありますか?

4

1 に答える 1

16

ユーザー名をキーとしてグループを作成するというあなたの呼びかけは良いものであり、実装するのが最も速いと思います。以下をサブスクライブすることにより、ページがロードされる(およびConnectionIdが変更される)たびに関数を呼び出すことができます。

$.connection.hub.start(function () {
    yourHub.register();
});

そして、コードビハインドのハブで:

public void Register()
{
    AddToGroup(username);
}

また、クライアントの画面を更新する場合は、次のようにします。

Clients[username].refreshClientScreen();

ここで、refreshClientScreen()は、ブラウザーで通知を非表示にするジョブを実行するjavascript関数です。

これを行う別の方法は、すべての要求でConnectionIdをチェックし、サーバー上でユーザーの接続を登録して永続化する場所を用意することです。それらを更新する必要がある場合は、それぞれに次のコードを使用できます。

Clients[ConnectionId].refreshClientScreen();

ConnectionIdは、ハブのContextオブジェクトにあります。

ConnectionId -sを保存する場所を管理し、IDisconnectを実装してDisconnectイベントをサブスクライブする必要があるため、2番目のアプローチを実装するのは難しいと思います。これにより、 ConnectionId - sリストを最新の状態に保つことができます。最初のアプローチ-グループを使用するアプローチ。

于 2012-04-10T13:28:23.247 に答える