在ASP.NET中使用Session常见问题集锦(2)


问:如何获得当前Session中保存的所有对象?
答:可以通过遍历所有的Session.Keys来获得。代码如下:
ArrayList sessionCollection = new ArrayList();
foreach (string strKey in Session.Keys){
  sessionCollection.Add(Session[strKey]);
}

问:是否可以在不同的应用程序中共享Session?
答:不能直接共享。可以参考如何在ASP和ASP.NET之间共享Session。

问:Session.Abandon和Session.Clear有何不同?
答:主要的不同之处在于当使用Session.Abandon时,会调用Session_End方法(InProc模式下)。当下一个请求到来时将激发Session_Start方法。而Session.Clear只是清除Session中的所有数据并不会中止该Session,因此也不会调用那些方法。

问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
 当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。
 当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。
 读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。

问:Session平滑超时意味着什么?
答:Session平滑超时意味着只要你的页面访问(使用)了Session,超时时间将被刷新(可以理解为重新计时),即从该页面请求开始,将重新计算超时时间。但是,该页面不能禁用Session。它会自动的访问当前页面的Session,刷新超时时间。

问:在global.asax中的事件处理函数中Session为什么无效?
答:依赖于在哪个事件处理函数中使用Session,Session在AcquireRequestState事件之后才有效,该事件之后的所有事件处理函数都可以使用Session,之前的则不能。

问:当我写一个依赖于当前应用的Session的组件时,为什么不能直接使用Session["Key"]获得其值?
答:Session["Key"]实际上是this.Session["Key"],它是作为Page的一个属性提供的,所以在你的组件中不能直接使用这个属性。你可以通过下面的方式使用Session:
 HttpContext.Current.Session["Key"] = "My Seesion Value";

问:当我使用InProc模式保存Session时,此时的Session是保存在哪里?
答:不同的IIS的处理方式不同,
 当使用的是IIS5的时候Session是保存在aspnet_wp.exe的进程空间里的。
 当使用的是IIS6时,默认情况下所有的应用程序共享应用程序池,Session保存在w3wp.exe的进程空间中。

问:Session的超时设置是分钟还是秒?
答:是分钟,默认为20分钟。

问:当页面出现错误后我的Session是否将被保存?我需要在Session_End中处理一些清理工作,但是失败了,为什么?
答:Session_End只有在Session运行在InProc模式下才会被执行。Session_End使用的帐号是运行aspnet_wp工作进程的帐号(这个可以在machine.config中设置)。因此,如果在Session_End方法里,使用集成安全性链接到SQL,它将使用aspnet_wp进程的帐号打开链接,此时成功与否则依赖于你的SQL的安全性设置。

问:为什么当我设置cookieless为true是我在重定向的时候会丢失Session?
答:当使用cookieless时,你必须使用相对路径替换程序中的绝对路径,如果使用绝对路径ASP.NET将无法在URL中保存SessionID。
 例如:将\myDir\mySubdir\default.aspx换成..\default.aspx即可。

问:如何将SortedList存储到Session或者Cache里?
答:请参考下面的方法:
 SortedList x = new SortedList();
 x.Add("Key1", "ValueA");
 x.Add("Key2", "ValueB");
 保存到Session中:
 Session["SortedList1"] = x;
 使用下面方法获得之:
 SortedList y = (SortedList) Session["SortedList1"];
 Chahe则同理。

问:我为什么会获得这样的错误信息“Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive”?
答:这个问题可能在一个已经安装了Microsoft Visual Studio .NET开发环境的机器上,再安装Window Sharepoint Server(WSS)后出现。
 WSS ISAPI过滤器会处理所有的请求。当你通过虚拟目录浏览一个ASP.NET的应用程序时,ISAPI过滤器不会给文件夹目录分配URL。
 解决方法是:不要再安装了WSS的机器上使用Session。
 详细信息请参考:
 Session state cannot be used in ASP.NET with Windows SharePoint Services
 ?scid=kb;en-us;837376

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjfjfx.html