从SignalR呼叫特定的客户端


70

我想从服务器呼叫特定的客户端,而不是广播给所有的客户端。问题是我属于某些AJAX请求的范围(在.aspx代码后面,可以说),而不属于Hub或PersistentConnection,因此没有Clients属性-进行该ajax(jquery)调用的客户端不是该客户端我想发送信号器消息!

现在,我有一个在JS页面加载时调用的中心,它将新客户端注册到服务器静态列表中,因此我有客户端Guid。但是不知道如何使用它从服务器向特定客户端发送消息。

Answers:


46

3
“客户端=连接”,因此每个请求都将为您提供一个新的客户端ID。在下一版SignalR中,我们将让您覆盖生成客户端ID的逻辑,以便您可以将其与更相关的内容相关联。现在,您应该将客户端ID关联到与您的应用程序相关的内容(例如用户名)。
davidfowl 2011年

4
对于那些对通过Wiki挖掘不感兴趣的人(我强烈建议您这样做-很棒),似乎connection.BroadCast(clientId,messageHere)已被Send(clientId,data)代替。
nillls'2

21
有没有人提供设置客户端ID而不是使用自动生成的示例?
Zorn先生2012年

27
IMO如果您只是要提供指向文档的链接,则应仅是对问题的评论。
AaronLS 2015年

3
当前正在meta

26
$('#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);
  }

5
$ .connection.hub.id是undefined
ibiza

2
我认为Clients.Client(connID)Send()返回中,实际上是从该客户端Send开始调用该函数的客户端。这意味着该Send函数实际上将向同一客户端广播消息。有什么意义?
纳瓦兹

@Nawaz实际上,他们正在传递connID,所以这就是目标。但是,不应传递实现细节,也不应首先在外部公开它们。应该将用户ID传递给用户代理,或者将其传递给用于映射它们的客户端代理的静态字典。
克里斯·博德曼

将连接ID​​从服务器传递到客户端是否安全?反之亦然,这对我来说就像是一种脆弱?
Max Carroll

11

每次将请求发送到集线器服务器时,您的请求将具有不同的连接ID,因此,我添加了一个静态哈希表,该表包含一个用户名-并不会不断变化,并且每次都有一个r来的连接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);
    }
}

3

当您想发送消息到特定的ID

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

1

如果特定用户实际上是它自己的呼叫者,则可以使用:

Clients.Caller.myJavaScriptClientFunction();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.