如果以前有人问过这个问题,我深表歉意,但我还没有完全找到我脑海中的具体问题。
对于我正在构建的网站(使用 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 是否不能为当前会话执行?