ASP.NET/Session
< ASP.NET
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数据存储类)实例时候被调用。