ASP.Net中的SignalR 1.01集线器:跨页面存储组信息

时间:2013-04-07 02:24:36

标签: asp.net signalr sql-server-2008r2-express

我目前正在构建一个SignalR应用程序(使用ASP.Net MVC4,在带有SQL Server 2008 R2 Express的IIS7上),用户进入大厅并放入组中,然后在不同的页面上进行交互。

Html5 LocalStorage是任何参与者的要求,因此我可以在客户端存储组信息。

关于SignalR群组成员资格的应用程序设计,我有两个问题:

  1. 在服务器上存储组成员资格的最佳方法是什么?单例变量,具有组和连接ID的数据库或不同的东西?数据库是SQL Server Express和大约100-200个用户的问题吗?

  2. 页面更改期间会发生什么变化?我是否必须手动更新群组成员资格,进行断开连接/重新连接,如果是,我可以区分这种类型的断开与用户离开吗?

2 个答案:

答案 0 :(得分:5)

  1. 我使用msopentech.redis。一个非常快速的缓存,它也会保留您的数据。 (在谷歌上找到很多信息)您可以使用booksleeve(信号员团队也使用它)或servicestack.redis来访问它。这样您就不必将它放在静态变量或慢速数据库调用中。

  2. 在同一网站上更改每个页面后,您将收到断开连接和连接。 connectionID将是不同的,因此您应该使用某种机制将connectionid映射到登录用户并持久保存。也就是说,如果您希望能够发送单个消息而不是广播。

答案 1 :(得分:1)

(1)如果您打算仅为会话保留组信息,则应考虑在Hub / Persistent Connection类中使用静态变量来存储有关组的信息(内存要求允许)。例如,连接ID和组之间的字典/映射。重要的是要注意,在应用程序域重新启动或在Web场中的情况下,静态不会持久存在。

要避免这种情况,您只需将组信息存储在数据库中,而不必担心在应用程序域重新启动期间丢失它。

您还应该看到Chat sample in the SignalR solution - 它使用静态变量来保存不同用户所在的聊天室的信息。

(2)如果您在同一个应用中的其他页面建立新连接,则连接ID将不同。刷新页面时,将触发断开连接事件,您将再次使用其他ID连接。在这些情况下,您需要在应用程序中手动使用会话管理机制将新连接ID映射到用户。