(一)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 就可以判断用户真实状态(不受断电之类突发情况的影响)