状态管理之Session

一、SessionID 会话标识符

默认情况下,SessionID存储在浏览未到期会话的Cookie中。如果要存储在UrlsessionState节点的cookieless设置为true

二、Session模式

默认是 InprocIIS进程中)、StateServer(状态服务的单独进程中)和SqlServer

1 StateServer模式

启用asp.net状态服务(进程中aspnet_state.exe就是状态服务进程)

<system.web>

    <sessionState mode="StateServer"

      stateConnectionString="tcpip=ServerIP:42424"

      timeout="20"/>

 </system.web>

2SqlServer模式

在命令行窗口输入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模式是一切类型,而对于StateServerSqlServer模式是一切可以序列化的类型。

三、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();

}

posted @ 2009-10-19 22:16  老Z  阅读(341)  评论(0编辑  收藏  举报