【问题标题】:Session_End called multiple times in the middle of a session在会话中间多次调用 Session_End
【发布时间】:2009-09-21 07:50:50
【问题描述】:

我是否错误地使用了 Session_End?

在我的应用程序中,我有一个缓存来加速页面加载,它工作得很好。最近,有人向我建议,我从不清空内存是在泄漏内存,并在 Session_End 上实现一个方法,该方法将清除与该会话 ID 关联的所有缓存条目。

虽然我偶尔会开始看到异常行为。加载页面时,我很少会看到一个空页面,由于该页面的缓存为空而显示异常。我在缓存访问和 session_end 方法中放置了一个调试器断点,希望下次它发生时能够捕获它。

下次它发生时,我对实际发生的事情感到非常惊讶。我的浏览器一直处于打开状态但闲置了很长时间,所以我猜它有一个陈旧的会话 cookie。它访问页面的服务器,将页面的副本放入缓存中。当页面仍在加载时,会立即调用 Session_End,将其从缓存中删除。如果我重新加载浏览器,Session_End 会不断被调用,并积极尝试关闭糟糕的浏览器不断请求的会话。

所以我想我真正的问题是:

  • 如果旧的会话 cookie 对 IIS 很不利,为什么浏览器不获取新的会话 cookie?
  • Session_End 是不是根本不适合以这种方式使用?
  • 有没有更好的方法来做我想做的事?

@Sosh - 我的 global.asax.cs:

    protected void Session_End(Object sender, EventArgs e)
    {
        //clean up object cache on session expiry
        string sessionID = this.Session.SessionID;

        foreach (string key in Global.DataGroups.Keys)
        {
            if (key.EndsWith(sessionID))
            {
                Global.DataGroups.Remove(key);
            }
        }
    }

【问题讨论】:

    标签: asp.net iis internet-explorer sessionend


    【解决方案1】:

    是的,有更好的方法。使用内置的 Cache 对象。似乎您正在重新发明轮子……缓存将更加可靠。只需设置过期时间以匹配会话超时。如果您必须每 20 分钟重新加载一次缓存,那又如何?

    总的来说,我发现 Session_End 有点类似于 Application_End,因为您永远无法确定何时会调用它,而且有时会违反直觉。

    【讨论】:

    • 感谢您的提示 - 老实说,我不知道内置的 Cache 对象存在并且会为我处理所有这些。对于其他阅读此问题的人,我只是将我的缓存插入方法更改为与我之前使用的 Hashtable 完全相同,只是条目将在上次访问后 20 分钟过期。我的 Session_End 方法现在什么都不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2014-10-22
    • 2015-07-15
    相关资源
    最近更新 更多