0

在我的 Web 应用程序中,我测试一个页面上的条件,并希望将测试结果保留指定的持续时间(例如 5 分钟)。当然,我可以使用 cookie 来做到这一点,但以防万一用户禁用了 cookie,我认为自定义服务器变量可能会解决问题。我听说过这件事,但我无法找到这样做。

或者,也许会话变量可能更好?没有固有的方法可以使这些过期,对吗?在 IIS 将它扔掉之前,这样的变量还能存活多久?

4

2 回答 2

2

Asp.Net 具有会话状态。每个 Asp.Net 页面都有一个Session属性。您也可以通过 访问它HttpContext.Current.Session,尽管在它咬到您之前会有一些细微的差别(请参阅对问题的回答,Session 和 HttpContext.Current.Session 之间的差异

默认会话状态配置是in-memory。这意味着如果您的网站是从 F5 Networks Big IP(负载均衡器)集群之类的东西提供的,除非负载均衡器设置为“粘性”(这意味着一旦分配给集群中的机器,您除非它出现故障或从集群中删除,否则将始终命中该机器)。

如果您的集群网站没有粘性会话,那么当您的请求到达另一台机器时,您的会话状态将消失……然后在另一个请求到达原始机器时重新出现。你可以猜到这有多有趣。

您可以在 web.config 中启用对 SQL Server 会话的内置支持。以这种方式设置后,您将使用 SQL Server 作为会话状态的后备存储。这解决了上面提到的服务器场问题,但这样做的代价是每次访问会话状态值时都会访问 SQL Server。这会显着降低访问速度,尤其是在会话大小很大的情况下。奇怪的是,每次访问会话状态设置时执行 SQL 查询并通过网络推送 500kb 的会话博客会对性能产生负面影响。谁知道?[不要问我们是怎么发现的]。

这个问题还有其他解决方案:ScaleOut 的产品浮现在脑海中(例如,ScaleOut SessionServer)。

或者,您可以使用 AppFabric 缓存之类的东西滚动您自己的会话状态提供程序。

使用 SQL Server 会话状态的另一个“特性”是进入 Session 的任何内容都必须是ISerializable.

于 2014-02-13T23:01:27.003 回答
1

您不能设置服务器变量;相反,使用与当前用户绑定的 Session 是基于用户的数据的最佳方法。对于基于应用程序的数据,可以考虑缓存。所以假设前者,做:

Session["Key"] = MyValue

请注意,会话持续 20 分钟;如果您必须恰好有 5 分钟,则可以使用缓存,您可以在 5 分钟后显式过期:

Cache.Add(CurrentUserID.ToString() + "Key", "Value", .. TimeSpan.FromMinutes(5));

您可以使用当前用户的 ID 使缓存值特定于某个用户,或者使用 cookie,但设置HttpOnly=True在 cookie 对象上。HTTPOnly cookie 仅在服务器上,并且在客户端上永远无法访问,如下所示:

varcookie = New HttpCookie("Key", Value);
cookie.Expires = ..;
cookie.HttpOnly = true;
于 2014-02-13T22:09:19.607 回答