我们在开发网页时遵循的工作流程是将页面绑定到一个或多个会话变量,这些会话变量仅用于该页面,用于保存当前处理对象,因此在关闭页面时不需要它们。
关闭页面时如何丢弃这些会话变量?关于该技术或如何解决该问题的任何建议?
我们在开发网页时遵循的工作流程是将页面绑定到一个或多个会话变量,这些会话变量仅用于该页面,用于保存当前处理对象,因此在关闭页面时不需要它们。
关闭页面时如何丢弃这些会话变量?关于该技术或如何解决该问题的任何建议?
离开/关闭页面时不会引发服务器端事件。离开页面时也不会调用 Session_End 事件(在其他答案中提到),因为用户可能会导航到同一 Web 应用程序的其他页面(因此会话将继续存在)。
我可以想到 3 种可能的方法来解决(或解决)这个问题:
1 - 使用ViewState存储具有页面范围的数据。这就是 ViewState 的用途,除非您有大量数据,否则这应该不是问题。如果您有大量数据,请记住,对于每个请求,它将被序列化/反序列化并发送到客户端/返回到服务器(这可能会导致大量请求,因此性能不佳)。
2 - 不是将数据放入会话中,而是将其放入缓存中(具有低滑动到期超时)。在您的页面上,您可以通过与会话相同的方式访问您的数据,即 data = Cache["data"],但您必须准备好数据已从缓存中删除(您必须重新加载它例如再次从数据库中),如果两个请求之间的时间大于到期时间。
3 - 使用客户端(javascript) onUnload事件,并触发一些操作(例如 ajax 回调)以从会话中删除数据。但我认为 onUnload 事件不可靠(在任何情况下它都不会被触发,例如当浏览器因崩溃或任务管理器而终止时,或者如果 javascript 被禁用)。
如果您只为该页面使用变量,请将它们存储在viewstate中。ViewState 适用于页面范围的变量。
如果您正在使用 ASP.NET 会话(您可能是),您可以将 global.asax 文件添加到您的解决方案中。在那里可以找到这个事件委托(如果没有,创建它):
protected void Session_End(object sender, EventArgs e)
{
}
.. 在这里你可以清除你的会话集合。
protected void Session_End(object sender, EventArgs e)
{
Session.Clear();
}
这将在会话到期或用户单击注销时触发:)