默认情况下,SessionID存储在浏览未到期会话的Cookie中。如果要存储在Url将sessionState节点的cookieless设置为true
二、Session模式
默认是 Inproc(IIS进程中)、StateServer(状态服务的单独进程中)和SqlServer
1: StateServer模式
启用asp.net状态服务(进程中aspnet_state.exe就是状态服务进程)
<system.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=ServerIP:42424"
timeout="20"/>
</system.web>
2:SqlServer模式
在命令行窗口输入cmd并在命令行中运行如下命令。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S .\SqlExpress -E –ssadd
其中C:\Windows用你自己Windows的目录代替,v2.0.50727用你安装的2.0框架的版本号代替。-S指定SqlServer服务器地址,-E表示采用信任连接,-ssadd表示为SqlServer服务器添加状态服务的支持。操作结束后,你可以使用IDE的服务器资源管理器连接SqlExpress数据库,可以看到多了一个ASPState数据库,但是奇怪的是数据库中没有任何表却有很多存储过程,如图12-7所示。
其实,所有Session的数据都存放在了tempdb数据库内
打开Web.config文件,修改前面建立的sessionState节点。
<sessionState mode="SQLServer" sqlConnectionString="server=(local)\SQLEXPRESS;
Trusted_Connection=True" sqlCommandTimeout="60"></sessionState>
为sqlConnectionString属性指定以前一直用的连接字符串,唯一不同的是不需要再指定数据表的名字了。sqlCommandTimeout属性表示允许执行Sql命令最长的时间,默认为30秒,可以根据自己的需要适当调整这个数字。
Session能存储的类型为: 对于InProc模式是一切类型,而对于StateServer和SqlServer模式是一切可以序列化的类型。
三、timeOut属性
一旦超过timeout时间或者其他状况引起的Session丢失,Session中的数据都会回收。如果再使用Session,将会分配新的SessionID
四、Session事件和Application
public void Application_OnStart()
{
Application["UsersOnline"] = 0;//初始化数据,存储类型任何类型
}
public void Session_OnStart()
{
//在新会话启动时运行的代码
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
Application.UnLock();
}
public void Session_OnEnd()
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
Application.UnLock();
}