2

如果以前有人问过这个问题,我深表歉意,但我还没有完全找到我脑海中的具体问题。

对于我正在构建的网站(使用 ASP.NET MVC)——性能是一个重要特性。此外,该站点有可能托管在应用程序池每 20 分钟回收一次(或者如果达到内存阈值则更快)回收的环境中。我希望完全独立于依赖会话变量,而是将类似 GUID 的值存储在 cookie 中。我的理由是 - 由于 AppPool 回收,我不知道会话将持续多长时间,并且不希望他们的会话过早超时并导致他们不得不重复登录。

cookie 中的 GUID 值将充当我存储类似会话信息(用户 ID 值等)的表的查找键。因此,如果我需要这些数据,我可以从数据库中检索它。我仍然会使用 Session_OnEnd 事件来清除具有超过 20 分钟旧的“最后活动”值的行的会话表(或者无论长会话配置为持续)。所以我想我仍然会使用会话状态,而不是会话变量。

不过,我再次担心的是性能。因此,我很好奇是否有更好的方法可以避免使用会话变量,同时仍然能够了解用户是谁并以“类似会话”的方式管理他们对网站的访问。我仍然是 MVC 的新手,但多年来在 ASP.NET 方面拥有丰富的经验,所以我希望我的问题是有道理的!

编辑:我有点回避想要使用 SQL 会话状态,因为我可能会在一个共享的 sql 服务器托管环境中,并且不认为我将拥有一个能够在必要时创建/运行作业以进行删除的登录过期的 sql 会话数据等。在 AppPool 回收场景中依赖 Session_OnEnd 和 cookie 是否有任何真正的缺点?当 AppPool 回收时,Session_OnEnd 是否不能为当前会话执行?

4

4 回答 4

5

您假设会话仅存储在工作进程中,您可以拥有 SQL 状态会话,在继续之前检查此链接

于 2009-12-08T18:50:36.277 回答
1

使用数据库提供跨网络农场/花园的“持久”持久性是一种常用技术。还有分布式缓存系统可用于使会话状态数据在服务器和重新启动时可用。

例如,我见过的分布式系统之一使用 UDP 在多个服务器之间共享会话数据。我希望分布式缓存有一些性能优势,因为数据存储在服务器的内存中,因此没有数据库查找。

于 2009-12-08T18:52:24.860 回答
1

如果您不能使用进程内状态,则必须恢复到外部存储库,这很可能是数据库。

那么为什么不将会话状态存储在数据库中呢?对此有内置支持,它有效地解决了回收问题,同时在会话状态保持较小的情况下保持可接受的性能。

于 2009-12-08T18:52:49.040 回答
0

查看自定义缓存机制。就像您说的那样,您不能使用会话变量,因为听起来您的网站将进行负载平衡?由于从应用程序池中回收,会话可能会发生变化。您也不想要 View State 的开销(您可以使用它,但它会影响性能)。

缓存与其他提到的模型之间存在三个主要区别:

  1. 缓存是线程安全的
  2. 缓存中的项目会自动删除
  3. 缓存中的项目支持依赖项
于 2009-12-08T18:52:57.417 回答