[ASP.NET]配置使用SQL Server保存会话状态
会话状态是ASP.NET应用程序状态的其中一种,这种状态的特点是以用户为单位,每个会话对应一个用户,也就是说在该用户的整个访问过程,会话状态保存的数据都会持续保存于服务器的介质中,直到会话超时(即用户超过指定时间没有存取会话数据)。在服务器端保存会话状态的方式有几种,分别为:
1)InProc——这种方式会话状态保存在ASP.NET运行进程内,具体位置就是ASP.NET的Cache(高速缓存)内。
2)StateServer——这种方式会话状态保存在ASP.NET所带有的Wiindows服务进程中,该服务默认是禁用的,需要人手启动。
3)SQL Server——这种方式会话状态保存到SQL Server所管理的数据库中。具体又可以分为保存在临时数据库,ASPState数据库和自定义数据库三种方式。
4)自定义提供程序——这种方式要求开发人员自己开发会话状态的提供程序,会话状态的存取方式完全由该提供程序决定,由此可以保存在其他SQL数据库,或者XML文件,甚至文本文件中都可以。
本文目的在于说明怎样配置使用SQL Server来保存会话状态。
整个配置过程分为两部分:
第一部分,在ASP.NET程序运行的服务器上,配置所使用的数据库服务器。
第二部分,在ASP.NET程序的配置文件中修改会话状态的保存方式。
配置所使用的数据库服务器:
1)运行aspnet_regsql.exe程序,该程序位于目录C:\WINDOWS\Microsoft.NET\Framework\<ASP.NET版本号>下。首先双击运行该程序,为ASP.NET配置SQL Server。
选择“下一步”
选择按图中所示进行选择,然后“下一步”
填入与ASP.NET关联的数据库服务器信息,注意这里选择的数据库,在往后的ASP.NET应用程序中是可以改变的。填入完成之后选择“下一步”
之后还有两个界面,不过在那两个界面中只需要“下一步”,没有可选择的信息,所以这里不列出来了。
2)配置会话状态使用的数据库库。
正如刚才所说,使用数据库保存会话也分三种方式,临时数据库(SQL Server重启后会丢失数据)、ASPState数据库和自定义数据库。
注意 -ssadd, -E, -sstype 指令。
-ssadd 指令的功能是添加会话数据库,默认是添加到临时数据库
-E 指令的功能是使用WINDOWS身份验证,因为我演示的SQL Server在本机上,所以使用该指令才能连接,单独的 -ssadd是运行不了的。
-sstype 指令的功能是指定会话状态使用哪个数据库。随后的参数有 t、p'和c ,分别为临时数据库,ASPState数据库库和自定义数据库。
-d 的功能是在指定自定义数据库的时候,指定该数据库的名称,以数据库名称做参数。
使用临时数据库保存会话状态的指令:
临时数据库中多了两个用于保存会话状态信息的表。
使用ASPState数据库保存会话状态的指令:
执行之后,在数据库中出现了新的数据库ASPState。其中带有的表跟之前在临时数据库中的一致。
使用自定义数据库TestCustom数据库保存会话状态的指令:
除了拥有上述的表之外,还带有一系列自动添加上去的存储过程,其实这些存储过程不是自定义数据库才特有的。无论使用哪种数据库,都会有这些存储过程,只是当从一种数据库改到另一种数据库的时候,表会留下来,但存储过程就会全部转移到新使用的数据库中。
想要取消使用以上的设置,只需要-ssremove -E指令。
以上这些只能在本机的数据库中创建会话数据库,但正规的操作是不应该在数据库服务器上直接进行这些操作,很可能该服务器上根本没有ASP.NET的组件。
因此我们需要从ASP.NET程序的部署服务器,通过远程连接来进行配置,以下将演示这一实例,通过我的计算机连接到团队成员的远程计算机上。
要先说明,在CMD中运行aspnet_regsql.exe,要进行远程连接,需要使用-S -U -P指令,分别指定:数据库服务器名称/地址、连接使用的帐号和密码。
同时必须注明,要在SQL Server中配置会话数据库,必须具有创建表格,创建数据库,创建存储过程,和MSDB的RSExecRole角色权限。否则配置过程一定会出错。
以上配置指令在 119.120.74.150的机器上,使用帐号密码均为silin建立连接,然后创建一个自定义数据库TestCustom来保存会话状态。
以上就是关于ASP.NET使用SQL Server的配置。接下来是配置文件的修改。
修改ASP.NET程序的配置文件:
在ASP.NET的配置文件中找到<sessionState>区段,很可能没有这个区段,因为存在默认设置,这里假设没有这个区段,重新写入。
<sessionState mode="SQLServer" sqlConnectionString="所需连接字符串" /> 只需要这么简单的设置。当然还有其他设置,但要起到作用,最少只需要这两个属性设置就OK了。
完成上述设置之后,在程序中的存取的会话数据就会自动保存到数据库中,整个编码过程没有任何改动。ASP.NET的这个提供程序机制,的确把代码实现跟数据保存方式分离了。不过要注意,当把会话状态保存到ASP.NET运行进程以外的介质时,必定会进行序列化和反序列化,因此必须注意会话状态中保存的类型是否能够进行序列化。