会话状态与构成
HTTP 协议和规范的任何逻辑实体都没有对应关系。会话是由服务器端开发环境(例如传统的 ASP 和 ASP.NET)构建的抽象层。ASP.NET
展示会话状态的方式以及会话状态的内部实现方式都取决于平台的基础结构。因此,传统的 ASP 和 ASP.NET
以完全不同的方式来实现会话状态,预计在下一版的 ASP.NET 中会有进一步的改进和增强。
本文讨论如何在 ASP.NET 1.1
中实现会话状态,以及如何在被管理的 Web 应用程序中优化会话状态管理。
ASP.NET
会话状态概述
会话状态并不是 HTTP
基础结构的一部分。也就是说,应该有一个结构组件将会话状态与每个传入请求绑定在一起。运行时环境(传统的 ASP 或 ASP.NET)能够接受 Session
之类的关键字,并使用它指示服务器上存储的数据块。要成功解析 Session
对象的调用,运行时环境必须将会话状态添加到正在处理的请求的调用上下文中。完成此操作的方式因平台而异,但它是有状态 Web
应用程序的基础操作。
在传统的 ASP 中,会话状态是作为 asp.dll 库中包含自由线程 COM
对象来实现的。(您对此很好奇吗?其实该对象的 CLSID 是
D97A6DA0-A865-11cf-83AF-00A0C90C2BD8。)此对象存储以名称/值对集合的方式组织的数据。“名称”占位符表示用来检索信息的关键字,而“值”占位符表示会话状态中存储的内容。名称/值对按照会话
ID 进行分组,这样,每个用户看到的只是他/她自己创建的名称/值对。
在 ASP.NET 中,会话状态的编程接口与传统的 ASP
几乎是相同的。但它们的基础实现是完全不同的,前者比后者更具有灵活性、可扩展性和更强的编程功能。深入研究 ASP.NET 会话状态之前,让我们简单回顾一下
ASP.NET 会话基础结构的某些结构功能。
根据 mode
特性的值,将通过不同的步骤从不同的进程中检索会话状态并将其存储到不同的进程中。默认情况下,会话状态存储在本地的 ASP.NET
辅助进程中。特殊情况下,会将其存储在 ASP.NET Cache
对象的专用槽中(不能通过编程方式访问)。也可以将会话状态存储在外部,甚至是远程进程中(例如,名为 aspnet_state.exe 的 Windows NT
服务中)。第三个选项是将会话状态存储到由 SQL Server 2000 管理的专用数据库表中。