(一)ASP.NET 支持三种不同的状态提供程序,以下简单罗列一下:
InProc 会话值在ASP.NET辅助进程(aspnet_wp.exe或w3wp.exe)的内存中保持为活动对象。默认。
StateServer会话值被序列化并存储在单独进程(aspnet_state.exe)的内存中。该可以在其它计算机上运行。
SQLServer 会话值被序列化并存储在SQL Server表中。SQL Server的实例可以在本地运行,也可以远程运行。
(二)性能分析(获得越强大的功能就要付出一定效能):
因为需要将会话数据从外部储备库复制到本地会话词典中,所以请求导致性能下降了15%(进程外)到25% (SQL Server)。
如果您希望应用程序具有强大的功能,请使用SQLServer模式,而不要使用StateServer模式。
(三)使用StateServer模式
会话状态模块实例化应用程序的状态提供程序,从web.config文件中读取的信息对其进行初始化。
web.config文件设置如下:
<configuration>
<system.web>
<sessionState
mode="StateServer"
stateConnectionString="tcpip=expoware:42424" />
</system.web>
</configuration>
默认的计算机地址为127.0.0.1(本地主机),默认端口为42424
(四)使用SQLServer模式
如何创建数据库?ASP.NET提供两对脚本来配置数据库环境。第一对脚本名为InstallSqlState.sql和UninstallSqlState.sql,与会话状态NT服务位于同一个文件夹中。它们创建名为ASPState的数据库和几个存储的过程。但是,数据存储在SQL Server临时存储区域TempDB数据库中。
在这里我们引入有关临时表的概念,有关临时表本栏文章中应该有一篇有详细叙述。
临时表主要分:本地临时表,全局临时表;
使用SQLServer模式的原理就有些类似于“使用临时表来防止用户重复登陆”(网上有差不多的文章)原理利用是临时表的特性,在这里的SQLServer模式也是利用要SQL临时表相关特性。可以相互参详...
总之,使用SQLServer模式你会发现好多之前登陆等等相关疑难或者难以掌控的问题会应刃而解或提供新的解决方案。
附录:(摘:利用SQL Server的全局临时表防止用户重复登录)
… …
有什么东西是在connection断开后可以被系统自动回收的呢?对了,SQL Server的临时表具备这个特性!用全局临时表来达到我们的目的。
CREATE PROCEDURE [dbo].[SP_CreatTbl]
...
if object_id('tempdb.dbo.##'+@v_userid) is null
begin
set @v_sql = 'create table ##'+@v_userid+'(userid varchar(6))'
exec (@v_sql)
set @i_out = 0
end
else
set @i_out = 1
… …
这样通過检测i_out就可以判断用户真实状态(不受断电之类突发情况的影响)