ASP.NET/Session

维基教科书,自由的教学读本

Session是服务器对象,用于保持用户的会话状态。例如:

Session["key1"] = DateTime.Now;

用户向服务器提交请求时,服务器会给用户分配一个SessionId,保存在用户浏览器的Cookies中。ASP.NET使用了120bit的标识符用以标识每个Session。这是足够安全的、不可逆的设计。用户页面切换时,Session对象的变量不会被清除。 ASP.NET_SessionId是全局的,只要Cookies还存在,服务器就会认为这是同一个用户,从而实现了每个用户都有自己独立的全局Session域。当用户再去请求的时候,在http头把这个SessionID的Cookie发到服务器端,服务器就以这个SessionId作为key在服务器端的Session中寻找;如果找到了就证明这个用户的状态是存在的。

关闭Session的办法:

  • web.config的<configuration>\<system.web>\<httpModules>之中全局关闭:<sessionState mode="Off"/>
  • 在web.config中设置:<pages enableSessionState="ReadOnly"> 或True, False,
  • aspx页的Page指令行,设置EnableSessionState为3个值之一:True, False, ReadOnly

从Session集合中移除所有项目,使用Session.Remove(strSessionName)或Session.RemoveAll()或Session.Clear();取消当前的Session,使用Session.Abandon()。

在ASP.NET中,有以下几种Session模式可以使用:

  • InProc:可能会丢失数据,因为网站会各种原因可能重启;Session保存的东西越多,就越占用服务器内存;服务器的内存不能在多台服务器间共享。在web.config中设置<sessionState mode="InProce" timeout="30" />
  • StateServer:在web.config中设置<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10" />。要求读写到Session中的类必须声明为[Serializable]。
  • SQLServer:需要使用aspnet_regsql.exe配置数据库,其命令行格式为-S ServerName -U username -P password -ssadd -sstype p。然后,SQL Server数据库的ASPState库将有两张表:ASPStateTempApplications与ASPStateTempSessions。
  • Custom:从基类SessionStateStoreProviderBase开发出自定义的Provider,你也能通过实现ISessionIDManager接口来产生SessionID。需实现4个方法:
    • Initialize方法中,我们能设置一个自定义Provider。将提供给Provider初始化连接。
    • SetItemExpireCallback被用作提供SessionTimeOut(Session过期),当Session过期时我们能注册一个方法进行调用。
    • InitializeRequest在请求发起的时候被调用
    • CreateNewStoreData在创建一个 SessionStateStoreData(Session数据存储类)实例时候被调用。