使用 signalr 通知除 self 之外的所有客户端

Posted

技术标签:

【中文标题】使用 signalr 通知除 self 之外的所有客户端【英文标题】:Use signalr to notify all clients except self 【发布时间】:2016-07-28 20:05:11 【问题描述】:

我使用 Signalr 2.2 通过 Hub 向 javascript 客户端发送通知。客户端向我的 REST Web api (c#) 发出 HTTP 请求,我的服务器使用 Signlar Hub 将更新推送到客户端。

我知道有一种方法可以管理向其发送通知的客户端,但目前我总是使用:~clients.all~。我不知道如何知道每个连接的 Id,我应该将这些 Id 保存在哪里以及如何使用它们?

我在较早的帖子中看到 ~clients.Others~ 可以使用,但这似乎与 Signalr 的旧 api 有关

谢谢

【问题讨论】:

【参考方案1】:

这会起作用-

Clients.AllExcept(Context.ConnectionId).hello(message);

【讨论】:

我没有可用的 Context 类,是在不同的命名空间中还是什么?【参考方案2】:

您可以将连接信息存储在 Hub 类的静态字典中。这是示例代码

        private static readonly ConcurrentDictionary<string, string> _connections = new ConcurrentDictionary<string, string>();

        public void SayHello(string message)
        
            Clients.Others.hello(message);
        

        public override System.Threading.Tasks.Task OnConnected()
        
            _connections.TryAdd(Context.ConnectionId, string.Empty);
            return base.OnConnected();
        
        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        
            string value;
            _connections.TryRemove(Context.ConnectionId, out value);
            return base.OnDisconnected(stopCalled);
        

【讨论】:

什么是 Clients.Others 属性?我没有那个 您使用的是哪个版本的 Signalr?这是 Hub API 调用指南asp.net/signalr/overview/guide-to-the-api/… 我使用最新的 2.2 .. 还有一个问题是如何在 Http 请求之后判断哪个客户端发出了请求?我了解在创建连接时如何获取客户端 ID,但稍后我该如何使用它们? 在您的情况下,您需要将 connectionId 作为输入传递给您的 REST API 调用,然后在服务器端使用它。您可以使用 $.connection.hub.start() .done(function() console.log('Now connected, connection ID=' + $.connection.hub.id); ) .fail 之类的代码访问连接 ID (function() console.log('无法连接!'); ); ); 有没有一种方法可以在不将其添加到每个请求的情况下实现连接 ID?这将导致大量代码更改。有没有办法将其放入缓存或 cookie 中并放入我的控制器中?

以上是关于使用 signalr 通知除 self 之外的所有客户端的主要内容,如果未能解决你的问题,请参考以下文章

jQuery选择除self之外的所有兄弟姐妹和孩子

我想在视图中滚动除按钮之外的所有内容

NSPredicate 返回除给定对象之外的所有对象

如何在 hubpipleline 之外使用 SignalR 集线器实例

GPS 可在除 Lollipop 之外的所有设备上运行

SqlDependency Start() 的多个实例与 SignalR