在工作中,遇见有多个站点需要共享Session值,找了好多相关的内容,要么就是看不太明白,要么就是太麻烦。后来终于是弄成了,先写下来,也许以后还用的着。
开发使用语言:C#
工具:VS2008简体中文版(英文版的被我换了,英文不太好......)
数据库:SQL Server 2005
运行平台:Windows Server 2003sp2 iis6.0
当有多个站点需要共用Session值,前提条件是都归属于同一个顶级域名下,如:aaa.123.com与bbb.123.com或者更多。应该都有安装.net Framework 2.0或者以上版本吧?
首先,要做的是在web.config添加如下配置:
<system.web><!-- 在system.web节点中添加下面的sessionState -->
<sessionState
cookieless="false"
<!--这个cookieless如果设置为 true 则会在链接上自动添加sessionid 使用上与用户无关是iis自动添加的 -->
regenerateExpiredSessionId="true" mode="SQLServer" timeout="20" <!-- 设置Session过期时间 -->
<!-- mode="SQLServer" 表示通过SQLServer会话模式创建Session(自己的理解) -->
sqlConnectionString="data source=127.0.0.1; uid=sa;password=">
<!-- sqlConnectionString这个就是链接数据库的字符串,建议数据库实例不使用SQLEXPRESS,后面会提到-->
</sessionState>
</system.web>
还一种写法,安全性更高些:
<sessionState
cookieless="true" timeout="20" <!-- 设置Session过期时间,分钟单位 -->
regenerateExpiredSessionId="true" mode="SQLServer" sqlConnectionString="data source=.; Integrated Security=SSPI;"> <!-- SSPI 指的是使用Windows身份验证模式登录 -->
</sessionState>
接着,需要开启SQLServer的作业功能,如果使用到了SQLEXPRESS,则看不到SqlServer的作业功能的,也就是为什么我前面说不建议使用SQLEXPRESS作为实例,也就是说如果是本机测试,直接打一个“.”加用户名密码就能登录SQLServer的情况。关于怎样开启SQLServer作业,看《SQL Server 作业》,有详细说明。
现在登录SQLServer,如果没启动SQLServer的作业,先启动下,找到“InstallSqlState.sql”这个文件,位于“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\”目录。
“v2.0.50727”是Framework的版本号,SQLServer2005使用的是.net Framework2.0的,所以只有2.0里面有这个文件:InstallSqlState.sql。
执行InstallSqlState.sql文件后会在数据库内创建一个AspState数据库,但是没有表,只是增加了许多存储过程。还有作业(这就是为什么要先开启作业功能并且不使用SQLExpress实例的原因,作业的功能就是1分钟检查一次Tempdb中的两个表,删除一些过期的Session值,要不Session值都会一直保存在数据库中的)。
在Tempdb中会增加两个临时表
ASPStateTempApplications
ASPStateTempSessions
在这可能会提示两个错误:
一个是:
消息 14261,级别 16,状态 1,过程 sp_add_category,第 26 行
指定的 @name ('[Uncategorized (Local)]')已存在。
这个不清楚什么用,错误了也没发现有什么异常的现象,所以不管它。
还一个是:
引起的可能是作业需要的一个服务没开启(SQL Server Agent) 需要在服务器和连接的外围应用配置器上面进行手动开启下,最好是直接设置成自动运行也就OK了。
所有的准备工作也就算做好了,最好检查一下作业是否已经开始正确运行,如果没有,手动对作业进行配置一下再运行,保证SQL Server会话的正常允许。如果你有耐心,自己在iis里面建两个web站点 然后在C:\WINDOWS\system32\drivers\etc\hosts 这个文件(用记事本打开)
在“127.0.0.1 localhost”后面换行增加
127.0.0.1 aaa.123.com
127.0.0.1 bbb.123.com
(作用是模拟域名效果,Session共享需要处于同一个顶级域名以下才有用)
两个站点的web.config都要和刚刚开始提到的配置文件那样先配置一下才有效,并且站点有对Session值进行输出,还有,别忘记了做个互访链接哈,方便查看嘛,将站点的主机头配置为上面设置的aaa.123.com与bbb.123.com,打开站点,就会发现,Session的值已经共享了。测试结束了别忘记清除刚刚模拟域名效果弄的东东,要不浏览器万一以后访问不了这两个你设置的域名的真实网站,别找我……
最后不能不说的一句话,微软很好很强大……
阅读全文