代码之家  ›  专栏  ›  技术社区  ›  Coxy

会话结束在会话中间多次调用

  •  2
  • Coxy  · 技术社区  · 15 年前

    我使用会话结束是否不正确?

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

    偶尔,尽管我开始看到反常的行为。加载页面时,很少会看到空页面,因为该页面的缓存是空的,所以会显示异常。我在缓存访问和会话结束方法中放置了一个调试器断点,希望在下次发生时捕获它。

    下一次它发生的时候,我对实际发生的事情感到非常惊讶。我的浏览器一直处于打开状态,但空闲了很长时间,所以我猜想它有一个过时的会话cookie。它会命中页面的服务器,该服务器会将页面的副本放入缓存中。当页面仍在加载时,会立即调用会话\结束,从而将其从缓存中删除。如果我重新加载浏览器,会话会一直被调用,非常想关闭我的会话,因为糟糕的浏览器一直在请求。

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

    • 如果旧的会话cookie对IIS来说是一种诅咒,那么为什么浏览器不获取新的会话cookie呢?
    • 会话结束是否只是设计为不以这种方式使用?
    • 有没有更好的方法来做我想做的?

    @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 回复  |  直到 15 年前
        1
  •  1
  •   Bryan    15 年前

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

    总的来说,我发现会话结束有点类似于应用程序结束,因为您永远无法确定何时调用它,有时它是违反直觉的。