0

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

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

我对与 SignalR 组成员资格相关的应用程序设计有两个问题:

  1. 在服务器上存储组成员身份的最佳方式是什么?单例变量、具有组和连接 ID 的数据库或其他不同的东西?对于 SQL Server Express 和大约 100-200 个用户,数据库是否会出现问题?

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

4

2 回答 2

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

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

于 2013-04-07T08:14:42.327 回答
1

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

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

您还应该在 SignalR 解决方案中看到聊天示例- 它使用静态变量来保存有关不同用户所在聊天室的信息。

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

于 2013-04-07T06:15:18.400 回答