使用 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 之外的所有客户端的主要内容,如果未能解决你的问题,请参考以下文章