在调用服务器后要继续在服务器中保留数据通常很难你可以用SQL Server来进行会话状态管理(用户会话数据)以下教你怎样用它来进行管理
在页面开发中在服务器调用里保留数据是一个常见的不好解决的难题你也许需要为你的应用程序或特殊用户的会话保存信息存储这样的数据被称为状态管理ASPNET为你提供了一些方法这些方法能让你通过各种途径完成这一任务这包括将数据存储在一个状态服务器的内存中或者通过Microsoft SQL服务器本文主要讨论了用SQL服务器来进行会话状态管理(用户会话数据)
为什么需要进行状态管理?
在设置和使用SQL Server之前你也许会想有必要这样做吗?页面开发还有更让人烦恼的一面那就是HTTP是一项无状态协议它的运行是断断续续的每个页面都会按接受到的命令运行命令执行完以后所有用过的数据都会丢失服务器不会存储关于那些调用的任何记忆也就是说它不会存储相关记忆除非有特殊的指令让它存储
会话变量
以下是使用会话变量的格式
C#: Session[variable_name] = value;
VBNET: Session(variable_name) = value
当这个值被存储了用户就可以在整个会话中使用它了会话结束后变量也就丢失了你也可以使用回归状态管理(这是我们下一次要讨论的话题)来处理这些丢失的值
ASPNET状态管理
ASPNET允许你通过一个状态服务器或SQL服务器将会话数据存储在内存中存储的位置由应用程序的页面配置文件来决定状态管理选项是在系统中的sessionState元素中页面元素是在状态管理中进行设置的以下的示例显示了怎样使用SQL Server
<sessionState
mode=SQLServer
stateConnectionString=tcpip=:
sqlConnectionString=data source=;user id=username;password=password
cookieless=false
timeout= />
注意这些元素的名称和属性都要区分大小写以下是该模式属性的各种可能值
InProc存储在内存中它的运行速度最快但是当ASPNET程序重复运行的时候所有的数据都会丢失
SQL Server将数据存储在SQL Server中由于它与页面服务器是分离的因此它是最可信的连接字符串会按照正常的顺序排列以连接到SQL Server数据库中
StateServer将数据存储在一个独立的页面服务器上(IIS)这一选项利用了stateConnectionString这一属性
所有的选项都使用保留 cookieless属性会告知用户那些cookies是被存储在内存(虚拟的)中还是保留在Querystring/URL(真实的)中timeout属性则会告知用户会话变量被存储的时间(没有接受任何命令)的长短
设置 SQL Server
SQL Server需要一个特殊的数据库来进行状态管理幸好NET Framework安装包括了必备的文件这些文件可以让它启动并立即运行以下的脚本都安装了
InstallPersistSqlStatesql包括建立数据库的脚本这个数据库是持久状态管理中要用到的
UninstallPersistSqlStatesql包括卸载持久状态管理的脚本
UninstallSqlStatesql包括卸载状态管理的脚本
这些脚本可能会从Query Analyzer中或通过使用isqlexe命令来运行要进行状态管理的话需要运行InstallSqlStatesql脚本的结果是由一个名为ASPState的数据库创建出来的它会处理会话变量的存储和保留问题你可以通过一个简单的例子来测试其功能性
下面的C#例子包括了将一个含有会话变量的页面格式变成另一种可以显示值的页面格式
<%@ Page language=c# %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
<HTML><HEAD>
<title>WebForm</title>
<meta name=GENERATOR Content=Microsoft Visual Studio NET >
<meta name=CODE_LANGUAGE Content=C#>
</HEAD>
<body MS_POSITIONING=GridLayout>
<script language=C# runat=server>
private void Page_Load(object sender SystemEventArgs e) {
Session[FirstName] = Tony;
Session[LastName] = Patton;
Session[Site] = ;
ResponseRedirect(WebFormaspx true);
}
</script></body></HTML>
Heres the second Web form:
<%@ Page language=c# %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
<HTML><HEAD><title>WebForm</title></HEAD>
<body>
<script language=C# runat=server>
private readonly string newLine = <br>;
private void Page_Load(object sender SystemEventArgs e) {
ResponseWrite(Session[FirstName]ToString() + );
ResponseWrite(Session[LastName]ToString() + newLine);
ResponseWrite(Session[Site]ToString() + newLine);
}
</script></body></HTML>
如果你是用VBNET 进行开发页面的格式就是下面这样的
<%@ Page Language=vb %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<html><head>
<title>WebForm</title></head><body>
<script language=vb runat=server>
Private Sub Page_Load(sender As Object e As SystemEventArgs)
Session(FirstName) = Tony
Session(LastName) = Patton
Session(Site) =
ResponseRedirect(WebFormaspx true)
End Sub
</script></body></html>
Heres the Page_Load event on the second form:
<%@ Page Language=vb %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<html><head>
<title>WebForm</title></head><body>
<script language=vb runat=server>
Private ReadOnly newLine As String = <br>
Private Sub Page_Load(sender As Object e As SystemEventArgs)
ResponseWrite(Session(FirstName)ToString() + )
ResponseWrite(Session(LastName)ToString() + newLine)
ResponseWrite(Session(Site)ToString() + newLine)
End Sub
</script></body></html>
关于卸载状态管理功能的一个注释微软建议在执行卸载脚本以前先取消World Wide Web Publishing服务你可以在命令行输入net stop wsvc命令来完成这一步你可以用net start wsvc命令重启机器
你可以在SQL Server中检测tempdb数据库这样你就可以毫不费力地看到会话管理属性是怎样运行的它使用两个临时表格来进行会话管理ASPStateTempApplications和 ASPStateTempSessions
一种可行的选择
如果你担心会由于 Web服务器停止运行而失去会话状态数据的话SQL Server是一种很好的选择不过由于数据库的交互作用它的性能也许会受些影响但是它还是最值得的信赖的而又可行的方法