1

所以,我在一个巨大的 .NET MVC 3 系统中工作。尽可能多的用户可以同时登录。我只是在用 HttpContext 写一种“嘿,还有人用这个键登录”的方式。但是,这是最佳做法吗?查询数据库更好吗?

我写的是:

     MvcApplication.SessionsLock();

        if (!force && MvcApplication.Sessions.Values.Any(p => p.ID.Equals(acesso.id_usuario.ToString(CultureInfo.InvariantCulture)) && p.Valid))
            throw new BusinessException("There's another user logged with this key. Continue ?");

     MvcApplication.SessionsUnlock();

我们的我可以查询我的数据库..也许是饼干?任何想法,将不胜感激

4

1 回答 1

1

贮存

该数据库为这些信息提供了一个集中的、持久的位置。您可能会使用自定义数据结构,或者 ASP.Net SQL 会话可能会满足您的要求(更多内容见下文)。

没有一种确定性的方法可以始终准确地知道用户会话何时结束。例如,您可以监听 Session End 事件,但它只会在进程内会话中触发,并且根本不保证触发(例如操作系统可能崩溃)。

无论如何,如果您正在构建一个“巨大的系统”,如您所说,您不应该设计反对使用进程内会话,因为它不会向上扩展。开始考虑更具可扩展性的基于 SQL 的会话状态(并且可能为您提供足够的信息来大致确定有多少用户处于活动状态)。

会话赞成/反对

我想知道会话是否是一个好习惯。那段代码有效。但我一直在阅读很多文章,反对在 ASP.NET MVC 应用程序上使用会话。

至于 Session 是好事还是坏事 - 一如既往 - 这取决于它的使用方式。正确设计的 MVC 应用程序可以呈现相当复杂的视图,而无需保留状态。部分原因在于对 AJAX 的强大支持(无需重新加载页面)和优雅的模型绑定(可以采用复杂的 Request.Form 并将其变成完整的模型)。

相反,将重复使用的信息的小片段放入会话状态,使用它来避免向客户端发送敏感数据,使用它来使用户流更顺畅等,本质上没有错。

请注意高安全性场景中的会话固定攻击。会话可能不合适和/或可能需要进一步手动保护。

需要注意的一件事是 ASP.Net 对会话进行了锁定。当一次发出多个请求时,这可能会导致非常实际的性能问题。通常,这不是问题,但考虑一个包含十几个 AJAX 小部件的页面,这些小部件都从使用会话的控制器或端点请求数据。这些将相互竞争(第一手经验)。

MVC 提供了一种简单的方法来将控制器标记为只需要对 Session 进行只读访问,从而消除了这个问题。但是,任何对 Session 的读/写活动仍将被序列化,因此请相应地进行计划。

业务注意事项

从业务的角度来看,知道会话已经过期并不总是很重要,因为工作已经停止(您是否关心他们停止使用该站点,或者他们的会话超时?)这可以通过检查最后修改的时间戳来可靠地解决关于实体并警告用户。警告,不要锁定。在我看来,您应该很少/从不基于 Web 应用程序中的登录/注销来锁定记录(太容易陷入锁定状态)。

于 2012-08-18T11:35:52.450 回答