在应用程序的web.config文件中,将<sessionstate>元素mode属性设置为stateserver,它是不是就没有办法进入Global文件的Session_End事件了?

解决方案 »

  1.   

    对,Session_End 只在InProc下才会触发,你想么,Session Expire是在另一个进程或机器上发生的,怎么触发在你进程里的Session_End函数?
    参考
    ASP.NET Session State FAQ
    http://www.eggheadcafe.com/articles/20021016.asp
      

  2.   

    Also Session_End event is supported only in InProc mode. 问下楼上的,这是哪个网战阿?资料不错的样子
      

  3.   

    那么我有办法捕捉session过期的事件吗?
    或者说我怎么知道session已经过期了?
      

  4.   

    你可以用sql语句检查数据库记录
    参见
    http://www.cnblogs.com/anders/archive/2005/03/30/32744.html将服务器Session信息存储在SQL Server中  首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:
    程序代码:
    [system drive]\winnt\Microsoft.NET\Framework\[version]\ 
      然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。  接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:
    程序代码:
    sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
      其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。  同样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储在SQL Server中的,能干什么就看你的发挥了
      

  5.   

    可是我现在的条件是将服务器Session信息存储在服务器上
    那么应该怎么办呢?