从 SignalR 调用特定客户端

Posted

技术标签:

【中文标题】从 SignalR 调用特定客户端【英文标题】:Call specific client from SignalR 【发布时间】:2011-12-13 22:16:52 【问题描述】:

我想从服务器调用特定的客户端,而不是向所有客户端广播。问题是我在一些 AJAX 请求的范围内(比如说在 .aspx 代码隐藏中),而不是在 Hub 或 PersistentConnection 中,所以没有 Clients 属性 - 进行 ajax (jquery) 调用的客户端不是客户端我想发送信号员消息!

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

【问题讨论】:

【参考方案1】:

查看最新文档:

持久连接 - https://github.com/SignalR/SignalR/wiki/PersistentConnection

集线器 - http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server

【讨论】:

"Client = connection" 所以每个请求都会给你一个新的客户端 ID。在下一版本的 SignalR 中,我们将让您覆盖生成客户端 ID 的逻辑,以便您可以将其与更相关的内容相关联。现在,您应该将客户端 ID 关联到与您的应用程序相关的内容(例如用户名)。 对于那些对挖掘 wiki 不感兴趣的人(我强烈建议您这样做 - 这太棒了),似乎 connection.BroadCast(clientId, messageHere) 已被 Send(clientId, data )。 有没有人有设置客户端ID而不是使用自动生成的示例? IMO 如果您只是要提供文档链接,那么它应该只是对问题的评论。 这个问题目前正在meta讨论【参考方案2】:
$('#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);
  

【讨论】:

$.connection.hub.id 是undefined? 我认为Send() 中的Clients.Client(connID) 返回实际调用Send 函数开头的同一客户端。这意味着Send 函数实际上将向同一客户端广播消息.有什么意义? @Nawaz 实际上,他们传递的是 connID,所以这就是目标。但是,不应该传递实现细节,也不应该首先将它们暴露在外部。应该传入一个用户 ID,并且可能是一个静态用户 ID 字典,用于映射它们的客户端代理。 将连接 ID 从服务器传递到客户端是否安全,反之亦然,这对我来说有点像漏洞? 当我们向接收者发送早先关闭的连接的消息时会发生什么?遇到这种情况该如何处理?【参考方案3】:

每次向中心服务器发送请求时,您的请求都会有不同的连接 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);
    

【讨论】:

【参考方案4】:

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

Clients.Caller.myjavascriptClientFunction();

【讨论】:

【参考方案5】:

当你想向特定的 id 发送消息时

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

【讨论】:

以上是关于从 SignalR 调用特定客户端的主要内容,如果未能解决你的问题,请参考以下文章

从 Mac 中的 ios 客户端调用 PC 中的 signalR 服务器

SignalR IOS 客户端,Web 套接字传输无法从服务器调用方法

SignalR 使用 GlobalHost.ConnectionManager.GetHubContext 从外部集线器调用客户端方法不起作用。但是从集线器内部调用确实

SignalR 2.2 客户端未收到任何消息

SignalR JavaScript客户端API调用连接

如何从SignalR客户端端确定服务器断开连接