web-dev-qa-db-ja.com

SignalRから特定のクライアントを呼び出す

サーバーから特定のクライアントを呼び出したいのですが、すべてのクライアントにブロードキャストしたくありません。問題は、私がいくつかのAJAXリクエストのスコープ内にいることを言います)。 ajax(jquery)呼び出しは、シグナルメッセージを送信するクライアントではありません。

これで、JSページの読み込み時に呼び出されるハブが1つあり、新しいクライアントがサーバー静的リストに登録されるため、クライアントGUIDがあります。しかし、それを使用してサーバーから特定のクライアントにメッセージを送信する方法がわかりません。

63
Hrvoje Hudo
44
davidfowl
$('#sendmessage').click(function () {
    // Call the Send method on the hub. 
    chat.server.send($('#displayname').val(), $('#message').val(), $.connection.hub.id);
    // Clear text box and reset focus for next comment. 
    $('#message').val('').focus();
});

サーバー側でクライアントのIDとそのIDへの応答を送信します

  public void Send ( string name , string message , string connID )
  {
        Clients.Client(connID).broadcastMessage(name , message);
  }
21
user2201030

ハブサーバーにリクエストを送信するたびに、リクエストは異なる接続IDを持つため、ユーザー名を含む静的なハッシュテーブルを追加しました。接続すると、接続IDが更新されます

 $.connection.hub.start().done(function () {
   chat.server.registerConId($('#displayname').val());
 });

およびサーバーコードで:

public class ChatHub : Hub
{
    private static Hashtable htUsers_ConIds = new Hashtable(20);
    public void registerConId(string userID)
    {
        if(htUsers_ConIds.ContainsKey(userID))
            htUsers_ConIds[userID] = Context.ConnectionId;
        else
            htUsers_ConIds.Add(userID, Context.ConnectionId);
    }
}
10

特定のユーザーが実際に呼び出し元である場合、次を使用できます。

Clients.Caller.myJavaScriptClientFunction();
1
radbyx

特定のIDにメッセージを送信する場合

 Clients.Client(Context.ConnectionId).onMessage(
               new Message{From = e.Message.From, Body = e.Message.Body}
               );
1
bilal