我是否错误地使用了Session_End?
在我的应用程序中,我有一个缓存来加速页面加载,它运行得很好。最近,有人建议我通过永不清空来泄漏内存,并在Session_End上实现一个方法,清除与该会话ID相关的任何缓存条目。
偶尔我开始看到异常行为。加载页面时,我很少会看到一个空页面,因为该页面的缓存为空而显示异常。我在缓存访问和session_end方法中放置了一个调试器断点,希望在下次启动时捕获它。
下次发生的时候,我对实际发生的事情感到非常惊讶。我的浏览器保持打开但很长时间闲置,所以我猜它有一个陈旧的会话cookie。它命中页面的服务器,该页面将页面的副本放入缓存中。当页面仍在加载时,会立即调用Session_End,从而将其从缓存中删除。如果我重新加载浏览器,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);
}
}
}
答案 0 :(得分:1)
是的,有更好的方法。使用内置的Cache对象。看起来你正在重新发明轮子......缓存会更加可靠。只需设置过期时间以匹配会话超时。如果你必须每20分钟重新加载一次缓存,那么呢?
一般来说,我发现Session_End有点类似于Application_End,因为你永远无法确定它什么时候被调用,而且它有时会违反直觉。