【问题标题】:How to tell different clients with SignalR server push?如何通过 SignalR 服务器推送告诉不同的客户端?
【发布时间】:2014-08-29 11:40:45
【问题描述】:

我刚刚完成了一个 SignalR 示例,即众所周知的 Chat sample

这个示例只是从一个客户端向所有客户端广播一条聊天消息。如果我们只想向特定客户端发送消息怎么办?

(我想应该有一些ID来标识每个客户端。这些ID应该在客户端订阅服务器时存储在服务器上。服务器可以选择将消息推送到哪个ID。)

【问题讨论】:

标签: signalr


【解决方案1】:

您有不同的方式将您的用户映射到连接。您可以根据自己的要求比较this tutorial中的不同方式。

另一种解决方案是为每个 userId 定义 1 个组,并在您想要通知用户时通知该组 (link)。小心,组不安全。

【讨论】:

  • 1 获取重要信息!我想在 MVC 5 项目中实现的下一件事是安全群聊和安全个人聊天。 “组不安全”是什么意思?
  • 我不确定这是否是 Daniel 所指的,但 SignalR 的 groupsToken(服务器使用它来验证客户端所在的组)不会过期。这使得无法安全地从组中删除客户端。
  • @Kr15 创建一个聊天室类,其中包含每个聊天室的所有用户。将 connectionIds 存储在其中。当用户在房间中发送消息时,遍历所有用户使用我的答案中的context.Clients.Client 来获取客户端并将消息发送给每个客户端。
  • 创建一个 ChatRoom 类或类似的用户列表。为每个房间或组或您所称的任何一个实例。
  • 您不需要为此使用 ASP.NET 库,但我要说的是,当用户连接到聊天室/组时,您需要以某种服务器端方式授权用户。
【解决方案2】:

就像 Daniel 描述的那样,您可以使用组或使用 hubcontext 通过连接 ID 获取特定连接的上下文。

var client = context.Clients.Client(connectionId);

还有几个抽象 SignalR 的库,其中一些带有自己调用特定用户的方式。

我已经制作了一个这样的库,它基于事件聚合模式。它带有一个 API,可让您创建代码来确定哪些客户端应接收特定事件

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/Implement-constraint-handlers

这也是我写的一篇博文,展示了如何使用我的库实现声明性角色授权,也许它可以给你一些想法。 http://andersmalmgren.com/2014/06/12/client-server-event-aggregation-with-role-authorization/

【讨论】:

  • 查看更新,我添加了一个关于声明性角色授权的博客文章的链接。也许会展示更多关于如何解决 SignalR 消息安全问题的天使
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多