关于Session
持久化这方面的话题,有很多人已经写过了,但是,毕竟这是我的项目经验,更加真实,可用。 进入主题。
情景一,Session ID
在客户端的状态 情景一中,saved in cookies
情况
ID保存在client端的Cookies集合中 缺点是,如果client端的cookie被禁用,那么ID无法保存 设置cookieless="false"
<
sessionState mode=
"InProc" stateConnectionString=
"tcpip=127.0.0.1:42424" sqlConnectionString=
"datasource=127.0.0.1;userid=sa;password=" cookieless=
"false"
timeout
="
20"
/>
情景一中,saved in url情况
MS为了解决cookie被禁时,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
设置cookieless="true"
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
cookielesstimeout="20"/>
=
"true"
情景二,Session状态在服务器中的三中模式,进程内、进程外、数据库。
情景二中,saved in 进程内
设置mode="InProc"
优点;保存在本机内存中,无需跨网络,访问内存速度快
缺点;如果IIS进程发生异常或者WebSite有文件变更,都被asp.netRuntime监视,然后重新设置Session状态
<sessionState
modestateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="datasource=127.0.0.1;userid=sa;password=" cookieless="false" timeout="20"/>
=
"InProc"
情景二中,saved in 进程外
设置mode="StateServer",启动asp.net状态服务
定位注册表
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424 注意这些参数都是十进制类型,且这些设置是在访问远程asp.net状态服务的必要设置。
优点;稳定,即使关闭WWW服务,只要启动asp.net状态服务,Session状态依然存在,不信你试试。
如果把状态保存在非本机上只需修改上面的注册表,修改stateConnectionString="tcpip=RemoteIP:Remoteport", 如果状态保存在远程机上的asp.net状态服务中,那么当页面关闭的时候,Session状态马上失效, 不管你的状态保存时间设置时间有多长,一律失效, 不信可以考试试,^-^。
<sessionState
mode="StateServer"
stateConnectionStringsqlConnectionString="datasource=127.0.0.1;userid=sa;password=" cookieless="false" timeout="20"/>
=
"tcpip=127.0.0.1:42424"
情景二中,saved in 数据库
设置
mode="SQLServer"。
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="。
启动SqlServer和SqlServerAgent。
定位到[systemdrive]/winnt/Microsoft.NET/Framework/[version]/。
执行InstallSqlState.sql。
然后我们看tempdb数据库中多了两个用户表,而且多了一个ASPstate的空库,
ASPStateTempApplications和ASPStateTempApplications表中 存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称, 实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作业, 发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息。
新建一个Asp.netWebSite,按F5,一切OK。
效果图形
两张表
ASPStateTempApplications表的数据
ASPStateTempSessions表的数据
ASPState_Job_DeleteExpiredSessions作业
需要注意的地方;
![](http://www.cnblogs.com/images/cnblogs_com/wmj/a.jpg)
![](https://i-blog.csdnimg.cn/blog_migrate/89c3fef6c7cf2972ca9d3fceaed88125.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/146fc11c29b984ee0ea19c5f76f9ad07.jpeg)
一,ASPStateTempApplications和ASPStateTempSessions表的权限用户是sa,既管理员。
二,启动MsSqlSeverAgent,
用来执行清除过期Session的作业ASPState_Job_DeleteExpiredSessions。
三,如果MsSqlServer与WebSite不在同一台机器上,那么设置
sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
结束 写得不妥之处,请多多指教!