2

我是否错误地使用了 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);
            }
        }
    }
4

1 回答 1

1

Yes there is a better way. Use the built-in Cache object. It seems like you are re-inventing the wheel... Cache will be much more reliable. Just set the expiration time to match the session timeout. If you have to reload the cache every 20 minutes, so what?

In general, I've found that Session_End is a bit akin to Application_End in that you can never quite be sure when it's going to be called and it's sometimes counter-intuitive.

于 2009-09-23T00:24:53.823 回答