web-dev-qa-db-ja.com

SignalRで自分以外のすべてのクライアントにメッセージをブロードキャストする

私はこれらの質問が似ていることを理解しています:

SignalR-呼び出し元を除くすべてのクライアントにブロードキャスト

現在のクライアントを除く、グループ内のすべてのクライアントにメッセージを送信します

しかし、それらは古く、現在のドキュメントには、私が正しいことをしているかどうかについての手掛かりは何もありませんでした。

これが質問/問題です:

サーバー側から、httpリクエストを送信した人を除くすべての接続されたクライアントにメッセージをブロードキャストできる必要があります-誰かがフォームを送信し、同じフォームに接続しているすべての人に何かが送信されたことが通知されることを想像してください。

私が今やっている方法は次のようなものです:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var connectionID = HttpContext.Request.Cookies["conn-id"].Value;
context.Clients.AllExcept(connectionID).addMessage(message);

そして、接続が確立されるたびに、クライアント側のCookieにConnectionIDを設定します。

$.connection.hub.start().done(function(){ 
      $.cookie("conn-id",$.connection.hub.id); 
});

だから私の質問は:

  1. これは私がこの場合に取ることができる最善/唯一のアプローチですか? hub.Context.ConnectionIDまたはHttpContext.Current.Session.SessionIDからSessionIDを取得するのと同じようなものから、リクエストを発信したクライアントの接続IDを読み取ることができますか?

  2. たとえば、クライアントがSessionIDに設定して接続するときに、接続IDをプログラムで設定できますか?それは何らかの理由で問題を引き起こす可能性がありますか?もしそうなら、接続IDをプログラムで設定する方法と、これを行うためにどのイベントに接続する必要があるかを説明できますか?

ページがリロードされるたびに、接続IDが別のGUIDに変更されることに気付きました。どのようにしてConnectionIdを1回だけ設定し、少なくともセッションの存続期間はそれを維持しますか?

22
Icarus

あなたのアプローチは機能しますが、正しいアプローチは組み込みAPI Clients.Others.addMessage(message)を使用することです。また、ハブ自体の内部にハブコンテキストを取得する必要もありません。常にContext.ConnectionIdを介して現在の接続IDにアクセスするか、Clients.All.foo();を介してクライアントにメッセージを送信できます。

また、ConnectinoIDをプログラムで設定することはできません。複数のページにわたってユーザーを追跡する場合は、サーバー上のユーザーのリストを維持し、サイトをナビゲートするときに接続IDを再割り当てします。

これがユーザーの追跡を説明する投稿です: SignalR 1.0 beta connection factory

29

Hubクラスのメソッドでメッセージを送信する場合は、Clients.Othersを使用して呼び出し元のクライアントを除外することもできます。ハブメソッドを使用していない場合にのみ、AllExcept(id)を使用する必要があります。

詳細については、以下を参照してください。

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#selectingclients

1