分享
 
 
 

认识ASP.NET会话状态

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

一、会话状态的功能

HTTP 是一个无状态的协议,所以它不自动指示一个请求序列是否都来自相同的客户端,甚至不指示单个浏览器实例是否仍活跃地查看某个页或站点。而使用ASP.net内置的会话状态功能,可以使用我们做到

1、对从单个浏览器客户端到服务器上逻辑应用程序会话的请求进行自动识别和分类。

2、将会话范围的数据存储在服务器上以供跨多个浏览器请求使用。

3、引发适当的可在应用程序代码中处理的会话生存期管理事件(Session_OnStart、Session_OnEnd 等)

二、会话状态的标识

在创建会话时,服务器会为每一个会话生成一个单独的标识。该标识用 120 位的 SessionID 字符串表示,该字符串只包含 URL 中所允许使用的 ASCII 字符。SessionID 值是使用保证唯一性和随机性的算法生成的,其中保证唯一性的目的是确保会话不冲突,保证随机性的目的是确保怀有恶意的用户不能使用新的 SessionID 来计算现有会话的 SessionID。

三、会话状态的存储方式

会话状态有三种存储方式

1、进程内会话状态模式(Inproc):当我们新建一个Web程序后默认的采用的进程内会话状态模式,这也是大家所普遍采用的模式。在这种模式下会话状态存储在本地的 ASP.NET 辅助进程中,可以说到目前为止,进程内会话状态模式可能是最快的访问选项。但会话中存储的数据越多,Web 服务器所消耗的内存就越多,这样会潜在地增加性能降低的风险。

2、.NET 状态服务器模式(StateServer):会话状态存储在远程进程中(例如,名为 aspnet_state.exe的 indows NT 服务中)

3、SQL 模式(SQLServer):会话状态存储到由 SQL Server 管理的专用数据库表中。

.NET 状态服务器模式和SQL 模式都可以称为进程外会话模式,当储存数据时,需要将数据序列化储存到外部储备库,当读取和数据时,需要将数据反序列化,复制到本地会话词典中,所以请求导致性能下降了 15%(进程外)到 25% (SQL Server)。注意这只是一种粗略的估计。但是在进程外存储方案中,会话状态存活的时间较长,使应用程序的功能更强大,因为它可以防止 Microsoft? Internet 信息服务 (IIS) 和ASP.NET 失败。通过将会话状态与应用程序相分离,您还可以更容易地将现有应用程序扩展到 Web Farm 和 Web Garden 体系结构中。另外,会话状态存储在外部进程中,从根本上消除了由于进程循环而导致的周期性数据丢失的风险。

四、会话状态的配置

会话状态的配置是通过设置Web.config文件的<sessionState>节来实现的。下面介绍一下三种会话状态的具体配置方法

1、进程内模式

进程内模式是默认的会话状态模式。若要使用进程内模式,请将 <sessionState> 元素的 mode 属性设置为 Inproc。

下面显示了进程内模式的一个配置设置示例。

<configuration>

<system.web>

<sessionState mode="Inproc"

cookieless="false"

timeout="20"/>

</sessionState>

</system.web>

</configuration>

2、状态服务器模式

若要使用状态服务器,必须首先确保 ASP.NET 状态服务运行在用于会话存储的远程服务器上。此服务与ASP.NET 和 Visual Studio .NET 一起安装在以下位置:

systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

然后,在应用程序的 Web.config 文件中,将 <sessionState> 元素的 mode 属性设置为 StateServer。最后,将 connectionString 属性设置为 tcpip=serverName:portNumber。

下面是状态服务器模式的一个配置设置示例。

<configuration>

<system.web>

<sessionState mode="StateServer"

stateConnectionString="tcpip=dataserver:42424"

cookieless="false"

timeout="20"/>

</sessionState>

</system.web>

3、SQL Server 模式

若要使用 SQL Server,首先在将存储会话状态的 SQL Server 计算机上,运行 InstallSqlState.sql 或 InstallPersistSqlState.sql。两个脚本均创建一个名为 ASPState 的数据库,它包含若干存储过程。

两个脚本间的差异在于放置 ASPStateTempApplications 和 ASPStateTempSessions 表的位置。InstallSqlState.sql 脚本将这些表添加到 TempDB 数据库,该数据库在计算机重新启动时将丢失数据。相反,InstallPersistSqlState.sql 脚本将这些表添加到 ASPState 数据库,该数据库允许在计算机重新启动时保留会话数据。

默认情况下,两个脚本文件均安装在下面的位置:

systemroot\Microsoft.NET\Framework\versionNumber

然后,在应用程序的 Web.config 文件中,将 <sessionState> 元素的 mode 属性设置为 SQLServer。最后,将 sqlConnectionString 属性设置为 Integrated Security=SSPI;data source=serverName;。

下面显示了 SQL Server 模式的一个配置设置示例。

<configuration>

<system.web>

<sessionState mode="SQLServer"

sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;"

cookieless="false"

timeout="20"/>

</sessionState>

</system.web>

</configuration>

在 SQL Server 模式中,也可以将会话状态配置为在故障转移群集中工作。故障转移群集是两个或更多相同的冗余 Web 服务器,它们将会话数据存储在一台单独的计算机上的 SQL Server 数据库中。如果一个 Web 服务器出现故障,群集中的另一个服务器会接管它的工作,为请求提供服务,会话数据不会丢失。

若要配置故障转移群集,请将 Web 服务器的 Web.config 文件中的 <machinekey> 元素设置为相同的值。

然后将 Web 服务器的 SQL 连接字符串设置为指向计算机上存储会话数据的 SQL Server 数据库。

五、会话状态的访问

你可以直接通过Session集合来实现对会话状态的访问。为了与 ASP 的早期版本兼容,还可以通过应用程序对象上的 Session.Contents 属性来实现对会话状态的访问。

下面的示例显示在第一个网页将两个值写入Session集合,然后再在第二个网页读取Session集合。注:此处省略了页代码。

第一个网页,将值写入Session集合

dim name as string = "a"

dim id as integer = "1"

session("name") = name

session("id") = id

第二个网页,从Session集合获取值

dim name as string = session("name")

dim id as integer = session("id")

'获取获取会话状态集合中的项数

dim i as integer = session.count

注意,在进程内模式,未发生真正的序列化和反序列化,所以对象作为各自类的活动实例存储在会话状态中。

而在进程外会话模式,因为使用了序列化和反序列化,所以你要根据情况对数据类型进行转换。

如对日期值执行序列化操作,日期应为 Int64 类型。

六、会话生存期管理事件

会话生存期管理事件有两个Session_OnStart事件和Session_OnEnd事件,你可以在Global.asax.VB文件中对它们进行设置

1、Session_OnStart事件

当从单个浏览器客户端连接到服务器上时,就会触发Session_OnStart事件,它标志着会话的开始,在此后的浏览过程中,将不在触发该事件,除非此次会话超时或被放弃。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。

示例:下面的示例是比较常用到的统计在线人数的Session_OnStart 事件代码:

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)

'当事件发生时,将在线用户的人数加1

Application("usercount") = Application("usercount") + 1

End Sub

2、Session_OnEnd事件

Session_OnEnd 事件在会话被放弃或超时发生,它标志着事件的结束。但请注意,只有 InProc 模式支持该事件。你可以通过Web.config文件的<sessionState>节的timeout属性来指定超时时限,如果用户在该超时时限之内(以分钟为单位,默认是20分

钟)不刷新或请求网页,则该会话将终止。可以利用Session_OnEnd 事件做一些清理工作。

示例:下面的示例是比较常用到的统计在线人数的Session_OnEnd 事件代码:

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)

Application("usercount") = Application("usercount") - 1

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有