Session_End在会话中间多次调用

时间:2009-09-21 07:50:50

标签: asp.net iis internet-explorer sessionend

我是否错误地使用了Session_End?

在我的应用程序中,我有一个缓存来加速页面加载,它运行得很好。最近,有人建议我通过永不清空来泄漏内存,并在Session_End上实现一个方法,清除与该会话ID相关的任何缓存条目。

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

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

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

  • 为什么浏览器没有获得新的会话cookie,如果旧的会话cookie是IIS的诅咒?
  • 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);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

是的,有更好的方法。使用内置的Cache对象。看起来你正在重新发明轮子......缓存会更加可靠。只需设置过期时间以匹配会话超时。如果你必须每20分钟重新加载一次缓存,那么呢?

一般来说,我发现Session_End有点类似于Application_End,因为你永远无法确定它什么时候被调用,而且它有时会违反直觉。