26

これらの質問は似ていることに気づきました。

SignalR - Caller を除くすべてのクライアントにブロードキャストする

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

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

質問/問題は次のとおりです。

サーバー側から、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. これは、この場合に私が取ることができる最善/唯一のアプローチですか? HttpContext.Current.Session.SessionID からhub.Context.ConnectionID取得する方法と同様の方法で、別の場所から要求を発信したクライアントの接続 ID を読み取ることはできますか?SessionID

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

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

4

2 に答える 2

33

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

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

ユーザーの追跡を説明する投稿は次のとおりです: SignalR 1.0 beta connection factory

于 2013-06-21T19:38:31.483 に答える
3

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

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

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

于 2013-06-21T19:38:21.933 に答える