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
实例化会话状态 HTTP 模块时,该模块将检查 Cookieless 特性的值。如果为 true,则将请求重定向 (HTTP 302) 到经过修改的包含会话 ID(紧跟在页面名称前)的虚拟 URL。再次处理请求时,请求中会包含该会话 ID。如果请求启动新的会话,HTTP 模块将生成新的会话 ID,然后重定向该请求。如果回传请求,则会话 ID 已经存在,因为回传使用相对 URL。
使用 Cookieless 会话的缺点是,如果调用绝对 URL,将丢失会话状态。使用 Cookie 时,您可以清除地址栏,转至其他应用程序,然后返回上一个应用程序并检索相同的会话值。如果在禁用会话 Cookie 时执行此操作,将丢失会话数据。例如,以下代码将打断该会话:
<a runat="server" href="/code/page.aspx">;Click</a>;
如果需要使用绝对 URL,请通过一些小技巧手动将会话 ID 添加到 URL 中。您可以对 HttpResponse 类调用 ApplyAppPathModifier 方法。
<a runat="server"
href=<% =Response.ApplyAppPathModifier("/code/page.aspx")%>; >;Click</a>;
ApplyAppPathModifier 方法将使用表示 URL 的字符串,并返回嵌入会话信息的绝对 URL。例如,需要从 HTTP 页面重定向到 HTTPS 页面时,此技巧特别有用。
小结 会话状态最初由传统的 ASP 引入,它是基于词典的 API,使开发人员能够存储会话期间的自定义数据。在 ASP.NET 中,会话状态支持以下两种主要功能:Cookieless 会话 ID 存储和传输,以及会话数据实际存储的状态提供程序。为实现这两种新功能,ASP.NET 利用 HTTP 模块控制会话状态与正在处理的请求上下文之间的绑定。
在传统的 ASP 中,使用会话状态就是指使用 Cookie。在 ASP.NET 中已不再如此,因为可以使用 Cookieless 架构。借助 HTTP 模块的力量,可以分解请求的 URL 以使其包含会话 ID,然后将其重定向。接下来,HTTP 模块会从该 URL 中提取会话 ID 并使用它检索任何存储的状态。
会话的物理状态可以存储在三个位置:进程内内存、进程外内存和 SQL Server 表。数据必须经过序列化/反序列化处理,才能供应用程序使用。HTTP 模块会在请求开始时将会话值从提供程序复制到应用程序的内存中。请求完成后,修改后的状态将返回提供程序。这种数据通信会对性能产生不同程度的不利影响,但是会大大增强可靠性和稳定性,也使对 Web Farm 和 Web Garden 体系结构的支持更容易实现。
查看本文来源