2011-12-16 86 views
1

我目前使用ASP.Net状态服务器来存储会话数据在我的应用程序。ASP.Net状态服务器和访问HttpContext.Current.Session

作为会话(不问)的更大问题的解决方法,我需要从会话中删除一组包含特定字符串的密钥,但我不知道确切的密钥。

我想做类似下面的代码。由于会话数据没有进程,我担心的是通过这样做,我将整个会话数据加载到ASP.Net工作进程中。这是一个问题,因为当前的应用程序会在会话中放置太多的数据(我们试图解决的较长期问题)。

有谁知道会话如何在引擎盖下被访问?有没有办法迭代会话密钥而不会将会话加载到内存中?

//does this line cause the session to be loaded back into the WP? 
var session = HttpContext.Current.Session; 

if (session != null) 
{ 
    //what about this line? 
    var keysToRemove = session.Keys.Cast<object>(). 
     Where(key => key.ToString().Contains(MYKEY)).ToList(); 
    foreach (var key in keysToRemove) 
    { 
     session.Remove(key.ToString()); 
    } 
} 

回答

1

根据用户对内置提供者的请求,整个会话总是加载到内存中。它在执行达到正常页面代码之前加载(不像您所假设的那样懒惰)。阻止加载的唯一方法是拥有侦听早期事件之一并从请求中删除会话ID的模块。

注意:session.Keys已经是字符串的集合,因此您可以移除这样复杂的投射。