与application对象不同的是, asp.net 的session对象可以在iis服务器或者工作进程重新启动时
恢复启动前的状态而不丢失其中的数据。这是因为存储在session中的所以信息都缺省的存储在
一个作为windows服务运行的状态服务器进程中。状态可以被序列化并以二进制形式保存在内存中。
程序员可以悬着使用microsoft sql server数据库来存储数据。
状态服务器服务和状态信息可以和web应用程序一起存在于同一台服务器上,也可以保存到外部的
状态服务器上。 为了指定如何存储信息,程序员可以在web.config文件中编写适当的配置。
asp.net会话状态模块在web.config文件中<system.web>标记下的<sessionstate>标记的mode属性来决定
该属性的四种可能的值: off、 inproc stateserver 和sqlserver。
1 inproc是缺省的设置
它允许“无cookie”的会话,以及在服务器之外存储
会话数据。asp.net会话状态模块在web.config文件中像下面这样配置:
<sessionstate mode="inproc" cookieless="false" timeout="20" />
在这个例子中,mode属性设为inproc(默认值),表明会话状态要由asp.net存储到内存中,而且
不用cookie来传递会话id。相反,会话id要直接插入一个网页url的查询字符串中。例如,采用
inproc模式并建立一个会话之后,调用一个假想的asp.net网页时,需要采用下面这样的url:
http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx
圆括号中长长的字母、数字字符串就是会话id。asp.net引擎从查询字符中提取会话id,并将用户
请求与特定会话联系起来。采取这种方式,不管cookie还是隐藏表单字段都用不着了。
所以,即使网页中没有使用表单,也能加入会话。
但是这种方法,应用程序的状态将依赖于 asp.net进程, 当iis进程崩溃或者正常重启时,保存在
进程中的状态将丢失。
2 mode属性设为off
和从前的asp一样,asp.net的会话状态管理是要产生开销的。所以,假如某个网页不需要访问
session对象,开发者应将那个页的page预编译指令的enablesessionstate属性设为false。
要为整个网站禁用会话状态,可在web.config文件中将sessionstate元素的mode属性设为off。
为了克服inproc 模式的缺点, asp.net 提供了两种进程外保存会话状态的方法。
3 stateserver会话管理
将mode属性设为stateserver,也就是将会话数据存储到单独的内存缓冲区中,再由单独一台机器上运行
的windows服务来控制这个缓冲区。状态服务全称是“asp.net state service ”(aspnet_state.exe),
它由web.config文件中的stateconnectionstring属性来配置。该属性指定了服务所在的服务器,以及要监
视的端口:
<sessionstate mode="stateserver"
stateconnectionstring="tcpip=myserver:42424"
cookieless="false" timeout="20" />
在这个例子中,状态服务在一台名为myserver的机器的42424端口(默认端口)运行。要在服务器上改变
端口,可编辑hklm/system/currentcontrolset/services/aspnet_state注册表项中的port值。
显然,使用状态服务的优点在于进程隔离,并可在web farm中共享。 使用这种模式,会话状态的存储将不
依赖于iis进程的失败或者重启,然而,一旦状态服务中止,所有会话数据都会丢失。换言之,状态服务不
像sql server那样能持久存储数据;它只是将数据存储在内存中。
4 用sql server进行会话管理
asp.net还允许将会话数据存储到一个数据库服务器中,方法是将mode属性变成sqlserver。
在这种情况下,asp.net尝试将会话数据存储到由sqlconnectionstring属性(其中包含数据源以及登录服
务器所需的安全凭证)指定的sql server中。
为了用恰当的数据库对象来配置sql erver,管理员还需要创建aspstate数据库,
方法是运行windir/microsoft.net/framework/version文件夹中的installstate.sql脚本(windir是服务
器的windows文件夹,而version是你使用的.net框架版本的安装文件夹)。
要配置sql服务器,可以在命令行中运行sql server 提供的命令行工具osql.exe
osql -s [ server name] -u [user] -p [password] <installsqlstate.sql
例如
osql -s (local)/netsdk -u sa -p "" -i installsqlstate.sql
在这里用户名必须是sql服务器上的sa帐号,或者具有同等权限的其他帐号。有兴趣的读者可以打开
这个脚本文件来了解asp.net是如何和sql server配合实现状态管理的。
卸载这些表和存储过程,可以使用uninstallsqlstate.sql脚本,使用方法与上面类似。
做好必要的数据库准备工作后,将web.config 文件中的sessionstate 元素的mode改为"sqlserver"
,并且指定sql连接字符串。具体如下:
mode="sqlserver"
sqlconnectionstring="data source=127.0.0.1; userid=sa; password="
配置好sql server后,应用程序代码运行时就和inproc模式没有什么区别。但要注意的是,由于数据不存
储在本地内存,所以存储会话状态的对象需要进行序列化和反序列化,以便通过网络传给数据库服务器,
以及从数据库服务器传回。这当然会影响性能。通过在数据库中存储会话状态,可分别针对扩展性及可靠
性来有效地平衡性能。另外,可以利用sql server的集群,使状态存储不依赖于单个的sql server, 这样就可以为应用程序提供极大限度的可靠性。
新闻热点
疑难解答
图片精选