将SignalR连接映射到用户

Dan*_*san 26 asp.net notifications signalr signalr-hub

考虑像Facebook这样的Web应用程序,它可以向用户发送实时通知.

使用asp.net SignalR来跟踪哪个连接ID属于哪个用户的最佳方法是什么,即使用户断开连接或稍后重新连接?

tug*_*erk 27

查看以下博文:

将ASP.NET SignalR连接映射到真实应用程序用户

简而言之,您将在OnConnected方法上向用户添加连接ID 并删除该OnDisconnected方法上的该连接.请记住,应用程序用户可以拥有多个连接.因此,您需要在用户和连接ID之间建立一对多的关系.以上链接的帖子详细解释了它的样本.


dev*_*rts 6

我为内部应用做了这个.我这样做的方式是当用户连接时,我让服务器要求用户注册自己.这样我知道不仅用户连接了他们的signalR connnectionID,而且他们还可以告诉我任何其他信息(如用户名或其他).

当他们重新连接时,我要求他们再做一次.

SignalR将为每个客户端维护相同的connectionID,即使它们重新连接也很好.重新连接与初始连接不同.新连接表示新客户端,但重新连接在同一客户端上.

在我的应用程序中,我维护了一个单独的线程安全字典,我跟踪哪个用户和哪个connectionID正在做什么.这样我可以说"哦,向用户ABC发送消息"并查找其connectionID.然后在signalR中为该connectionID执行Hub的客户端对象.如果你这样做,你甚至可以在mutliple连接中拥有相同的"用户".想象一下,用户"abc"在两个浏览器选项卡中打开.如果你严格按照connectionID进行操作,那么他们在技术上就是两个不同的用户.但是,通过维护某种本地集合分组用户和连接,您现在可以为同一用户建立多个连接.

我应该提一下,如果你这样做,你应该确保你的网站处理重启时发生的事情,并丢失所有的连接信息.对我来说,当有人重新连接时,我要求他们再次重新认识自己.这样,当服务器上线时我可以重新构建我的本地字典而不用担心.它确实有更多的开销,因为现在您要求所有客户向您发送信息,但根据您的用户情况,这可能会交错或聚集或以其他方式分发以帮助您处理负载.

通常,无论您获得本地信息(无论是通过要求用户提供),还是通过http上下文会话信息,您都需要自己跟踪它.

  • 你说SignalR将保持相同的连接ID,即使它们断开连接或重新连接.我刚刚用它们提供的聊天样本对此进行了测试,Clients.Caller.newMessage(Context.ConnectionId); ,我在每个页面刷新时获得一个新的连接ID.那么,它真的是同一个id吗?如果是这样的话会很棒 (2认同)