在asp.net中实现会话状态基础 5
点击次数:26 次 发布日期:2008-11-26 10:45:53 作者:源代码网
|
源代码网推荐 源代码网推荐 Session_OnStart 事件的情况如何呢?也会为每个请求引发该事件吗?如果应用程序定义 Session_OnStart 处理程序,则会始终保存会话状态,即使会话状态为空。因此,对于第一个请求之后的所有请求来说,会话 ID 始终为常量。仅在确实必要时,才使用 Session_OnStart 处理程序。 源代码网推荐 源代码网推荐 如果会话超时或被放弃,下次访问无状态应用程序时,其会话 ID 不会发生改变。经过设计后,即使会话状态过期,会话 ID 也能持续到浏览器会话结束。也就是说,只要浏览器实例相同,就始终使用同一个会话 ID 表示多个会话。 源代码网推荐 源代码网推荐 Session_OnEnd 事件标志着会话的结束,并用于执行终止该会话所需的所有清除代码。但请注意,只有 InProc 模式支持该事件,也就是说,只有将会话数据存储在 ASP.NET 辅助进程中时才支持该事件。对于要引发的 Session_OnEnd 事件来说,必须首先存在会话状态,这意味着必须在该会话状态中存储一些数据,并且必须至少完成一个请求。 源代码网推荐 源代码网推荐 在 InProc 模式下,作为项目添加到缓存中的会话状态被赋予一个可变过期时间策略。可变过期时间表示如果某个项目在一定时间内没有使用,将被删除。在此期间处理的任何请求的过期时间都将被重置。会话状态项目的时间间隔被设置为会话超时。用来重置会话状态过期时间的技术非常简单和直观:会话 HTTP 模块只读取 ASP.NET Cache 中存储的会话状态项目。如果知道 ASP.NET Cache 对象的内部结构,该模块将进行计算以重新设置可变过期时间。因此,当缓存项目过期时,会话已超时。 源代码网推荐 源代码网推荐 过期的项目将自动从缓存中删除。状态会话模块作为此项目的过期时间策略的一部分,也代表了一个删除回调函数。缓存将自动调用删除函数,删除函数然后将引发 Session_OnEnd 事件。如果应用程序通过进程外组件来执行会话管理,则永远不会引发结束事件。 源代码网推荐 源代码网推荐 Cookieless 会话 源代码网推荐 源代码网推荐 每个活动 ASP.NET 会话都是使用仅由 URL 允许的字符组成的 120 位字符串标识的。会话 ID 是使用随机数生成器 (RNG) 加密提供程序生成的。该服务提供程序返回一个包含 15 个随机生成数的序列(15 字节 x 8 位 = 120 位)。随机数数组然后被映射到有效的 URL 字符并以字符串形式返回。 源代码网推荐 源代码网推荐 会话 ID 字符串被发送到浏览器,然后通过以下两种方式之一返回服务器应用程序:使用 Cookie(就像在传统 ASP 中一样)或经过修改的 URL。默认情况下,会话状态模块将在客户端创建 HTTP Cookie,但是可以使用嵌入会话 ID 字符串的修改后的 URL(特别是对于不支持 Cookie 的浏览器)。采用哪种方法取决于应用程序的 web.config 文件中所存储的配置设置。要配置会话设置,可以使用 <sessionState>; 区段和 Cookieless 特性。 源代码网推荐 源代码网推荐 <sessionState cookieless="true|false" />; 源代码网推荐 源代码网推荐 默认情况下,Cookieless 特性为 false,表示使用了 Cookie。实际上,Cookie 只是 Web 页放在客户端硬盘上的一个文本文件。在 ASP.NET 中,Cookie 由 HttpCookie 类的一个实例来表示。通常,Cookie 包含名称、值集合和过期时间。Cookieless 特性被设置为 false 时,会话状态模块实际上将创建一个名为 ASP.NET_SessionId 的 Cookie 并将会话 ID 存储在其中。下面的伪代码显示了创建 Cookie 的过程: 源代码网推荐 源代码网推荐 HttpCookie sessionCookie; 源代码网推荐 sessionCookie = new HttpCookie("ASP.NET_SessionId", sessionID); 源代码网推荐 sessionCookie.Path = "/"; 源代码网推荐 源代码网推荐 会话 Cookie 的过期时间很短,在每个请求成功后更新过期时间。Cookie 的 Expires 属性表示 Cookie 在客户端的过期时间。如果未显式设置会话 Cookie,Expires 属性将默认为 DateTime.MinValue,即 .NET Framework 允许的最小时间单位。 源代码网推荐 源代码网推荐 要禁用会话 Cookie,请在配置文件中将 Cookieless 特性设置为 true,如下所示: 源代码网推荐 源代码网推荐 <configuration>; 源代码网推荐 <system.web>; 源代码网推荐 <sessionState Cookieless="true" />; 源代码网推荐 </system.web>; 源代码网推荐 </configuration>; 源代码网推荐 源代码网推荐 此时,假设您请求以下 URL 处的页面: 源代码网推荐 源代码网推荐 http://www.contoso.com/sample.aspx 源代码网推荐 源代码网推荐 浏览器地址栏中实际显示的内容会有所不同,现在包含会话 ID,如下所示: 源代码网推荐 源代码网推荐 http://www.contoso.com/(5ylg0455mrvws1uz5mmaau45)/sample.aspx 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
