我目前正在构建一个SignalR应用程序(使用ASP.Net MVC4,在带有SQL Server 2008 R2 Express的IIS7上),用户进入大厅并放入组中,然后在不同的页面上进行交互。
Html5 LocalStorage是任何参与者的要求,因此我可以在客户端存储组信息。
关于SignalR群组成员资格的应用程序设计,我有两个问题:
在服务器上存储组成员资格的最佳方法是什么?单例变量,具有组和连接ID的数据库或不同的东西?数据库是SQL Server Express和大约100-200个用户的问题吗?
页面更改期间会发生什么变化?我是否必须手动更新群组成员资格,进行断开连接/重新连接,如果是,我可以区分这种类型的断开与用户离开吗?
答案 0 :(得分:5)
我使用msopentech.redis。一个非常快速的缓存,它也会保留您的数据。 (在谷歌上找到很多信息)您可以使用booksleeve(信号员团队也使用它)或servicestack.redis来访问它。这样您就不必将它放在静态变量或慢速数据库调用中。
在同一网站上更改每个页面后,您将收到断开连接和连接。 connectionID将是不同的,因此您应该使用某种机制将connectionid映射到登录用户并持久保存。也就是说,如果您希望能够发送单个消息而不是广播。
答案 1 :(得分:1)
(1)如果您打算仅为会话保留组信息,则应考虑在Hub / Persistent Connection类中使用静态变量来存储有关组的信息(内存要求允许)。例如,连接ID和组之间的字典/映射。重要的是要注意,在应用程序域重新启动或在Web场中的情况下,静态不会持久存在。
要避免这种情况,您只需将组信息存储在数据库中,而不必担心在应用程序域重新启动期间丢失它。
您还应该看到Chat sample in the SignalR solution - 它使用静态变量来保存不同用户所在的聊天室的信息。
(2)如果您在同一个应用中的其他页面建立新连接,则连接ID将不同。刷新页面时,将触发断开连接事件,您将再次使用其他ID连接。在这些情况下,您需要在应用程序中手动使用会话管理机制将新连接ID映射到用户。