分享
 
 
 

用SQL Server保持会话状态

王朝mssql·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

在调用服务器后要继续在服务器中保留数据通常很难,你可以用SQL Server来进行会话状态管理(用户会话数据)。以下教你怎样用它来进行管理。

在页面开发中,在服务器调用里保留数据是一个常见的不好解决的难题。你也许需要为你的应用程序或特殊用户的会话保存信息。存储这样的数据被称为状态管理,ASP.NET为你提供了一些方法,这些方法能让你通过各种途径完成这一任务。这包括将数据存储在一个状态服务器的内存中,或者通过Microsoft SQL服务器。本文主要讨论了用SQL服务器来进行会话状态管理(用户会话数据)。

为什么需要进行状态管理?

在设置和使用SQL Server之前,你也许会想有必要这样做吗?页面开发还有更让人烦恼的一面,那就是HTTP是一项无状态协议。它的运行是断断续续的,每个页面都会按接受到的命令运行。命令执行完以后,所有用过的数据都会丢失。服务器不会存储关于那些调用的任何记忆。也就是说,它不会存储相关记忆,除非有特殊的指令让它存储。

会话变量

以下是使用会话变量的格式:

C#: Session["variable_name"] = value;

VB.NET: Session("variable_name") = value

当这个值被存储了,用户就可以在整个会话中使用它了。会话结束后,变量也就丢失了。你也可以使用回归状态管理(这是我们下一次要讨论的话题)来处理这些丢失的值。

ASP.NET状态管理

ASP.NET允许你通过一个状态服务器或SQL服务器将会话数据存储在内存中。存储的位置由应用程序的页面配置文件来决定。状态管理选项是在系统中的sessionState元素中,页面元素是在状态管理中进行设置的。以下的示例显示了怎样使用SQL Server:

<sessionState

mode="SQLServer"

stateConnectionString="tcpip=127.0.0.1:42424"

sqlConnectionString="data source=127.0.0.1;user id=username;password=password"

cookieless="false"

timeout="20" />

注意,这些元素的名称和属性都要区分大小写。以下是该模式属性的各种可能值:

• InProc-存储在内存中。它的运行速度最快,但是当ASP.NET程序重复运行的时候所有的数据都会丢失。

• SQL Server-将数据存储在SQL Server中。由于它与页面服务器是分离的,因此它是最可信的。连接字符串会按照正常的顺序排列,以连接到SQL Server数据库中。

• StateServer-将数据存储在一个独立的页面服务器上(IIS)。这一选项利用了stateConnectionString这一属性。

所有的选项都使用保留。 cookieless属性会告知用户那些cookies是被存储在内存(虚拟的)中还是保留在Querystring/URL(真实的)中。timeout属性则会告知用户会话变量被存储的时间(没有接受任何命令)的长短。

设置 SQL Server

SQL Server需要一个特殊的数据库来进行状态管理。幸好.NET Framework安装包括了必备的文件,这些文件可以让它启动并立即运行。以下的脚本都安装了:

• InstallPersistSqlState.sql-包括建立数据库的脚本,这个数据库是持久状态管理中要用到的。

• UninstallPersistSqlState.sql-包括卸载持久状态管理的脚本。

• UninstallSqlState.sql-包括卸载状态管理的脚本。

这些脚本可能会从Query Analyzer中或通过使用isql.exe命令来运行。要进行状态管理的话,需要运行InstallSqlState.sql。脚本的结果是由一个名为ASPState的数据库创建出来的。它会处理会话变量的存储和保留问题。你可以通过一个简单的例子来测试其功能性。

下面的C#例子包括了将一个含有会话变量的页面格式变成另一种可以显示值的页面格式:

<%@ Page language="c#" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML><HEAD>

<title>WebForm1</title>

<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">

<meta name="CODE_LANGUAGE" Content="C#">

</HEAD>

<body MS_POSITIONING="GridLayout">

<script language="C#" runat="server">

private void Page_Load(object sender, System.EventArgs e) {

Session["FirstName"] = "Tony";

Session["LastName"] = "Patton";

Session["Site"] = "Builder.com";

Response.Redirect("WebForm2.aspx", true);

}

</script></body></HTML>

Here's the second Web form:

<%@ Page language="c#" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML><HEAD><title>WebForm2</title></HEAD>

<body>

<script language="C#" runat="server">

private readonly string newLine = "<br>";

private void Page_Load(object sender, System.EventArgs e) {

Response.Write(Session["FirstName"].ToString() + " ");

Response.Write(Session["LastName"].ToString() + newLine);

Response.Write(Session["Site"].ToString() + newLine);

}

</script></body></HTML>

如果你是用VB.NET 进行开发,页面的格式就是下面这样的:

<%@ Page Language="vb" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html><head>

<title>WebForm1</title></head><body>

<script language="vb" runat="server">

Private Sub Page_Load(sender As Object, e As System.EventArgs)

Session("FirstName") = "Tony"

Session("LastName") = "Patton"

Session("Site") = "Builder.com"

Response.Redirect("WebForm2.aspx", true)

End Sub

</script></body></html>

Here's the Page_Load event on the second form:

<%@ Page Language="vb" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html><head>

<title>WebForm2</title></head><body>

<script language="vb" runat="server">

Private ReadOnly newLine As String = "<br>"

Private Sub Page_Load(sender As Object, e As System.EventArgs)

Response.Write(Session("FirstName").ToString() + " ")

Response.Write(Session("LastName").ToString() + newLine)

Response.Write(Session("Site").ToString() + newLine)

End Sub

</script></body></html>

关于卸载状态管理功能的一个注释:微软建议在执行卸载脚本以前先取消World Wide Web Publishing服务。你可以在命令行输入net stop w3svc命令来完成这一步。你可以用net start w3svc命令重启机器。

你可以在SQL Server中检测tempdb数据库,这样你就可以毫不费力地看到会话管理属性是怎样运行的。它使用两个临时表格来进行会话管理:ASPStateTempApplications和 ASPStateTempSessions.

一种可行的选择

如果你担心会由于 Web服务器停止运行而失去会话状态数据的话,SQL Server是一种很好的选择。不过由于数据库的交互作用,它的性能也许会受些影响,但是它还是最值得的信赖的而又可行的方法。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有