ASP.NET 应用程序状态概述

更新:2007 年 11 月

应用程序状态是可供 ASP.NET 应用程序中的所有类使用的数据储存库。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与特定于单个用户会话的会话状态不同,应用程序状态应用于所有的用户和会话。因此,应用程序状态用于存储那些数量较少、不随用户的变化而变化的常用数据。有关按用户保存数据的信息,请参见 ASP.NET 会话状态概述ASP.NET 配置文件属性概述

使用应用程序状态

应用程序状态存储在 HttpApplicationState 类的实例中。此类公开对象的键值字典。

在用户初次访问应用程序中的任何 URL 资源时,将会创建 HttpApplicationState 实例。HttpApplicationState 类通常通过 HttpContext 类的 Application 属性访问。

可以通过两种方式使用应用程序状态。可以通过代码直接对 Contents 集合中的值进行添加、访问或移除操作。在应用程序运行时,可以随时访问 HttpApplicationState 类。但该类通常用于在应用程序启动时加载应用程序状态数据。为此,可向 Global.asax 文件中的 Application_Start 方法中添加加载应用程序状态的代码。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

此外,还可以在 Web 应用程序的 Global.asax 文件中通过 <object runat="server"> 声明向 StaticObjects 集合添加对象。随后,就可以在应用程序中的任何地方通过代码对用这种方法定义的应用程序状态进行访问。下面的示例演示了应用程序状态值的对象声明:

<object runat="server" scope="application" ID="MyInfo" 
    PROGID="MSWC.MYINFO">
</object>

只能在 Global.asax 文件中向 StaticObjects 集合添加对象。如果试图直接通过代码添加对象,该集合将引发 NotSupportedException

不必引用 Application 集合,就可以访问应用程序状态中存储的对象成员。下面的代码示例演示了如何引用在应用程序状态的 StaticObjects 集合中定义的对象成员:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
    Label1.Text = MyInfo.Title;
End Sub

应用程序状态注意事项

使用应用程序状态时,必须注意以下重要事项:

  • 资源   由于应用程序状态存储在内存中,因此比将数据保存到磁盘或数据库中速度更快。但是,在应用程序状态中存储较大的数据块可能会耗尽服务器内存,这会导致服务器将内存分页到磁盘。除了使用应用程序状态之外,还可以使用 ASP.NET 缓存机制来存储大量的应用程序数据。ASP.NET 缓存也是将数据存储在内存中,因此速度很快;但是,ASP.NET 会对缓存进行主动管理,如果内存不足时将移除项。有关更多信息,请参见 ASP.NET 缓存概述

  • 易失性   由于应用程序状态存储在服务器内存中,因此每当停止或重新启动应用程序时应用程序状态都将丢失。例如,如果更改了 Web.config 文件,则要重新启动应用程序,此时除非将应用程序状态值写入非易失性存储媒体(如数据库)中,否则所有应用程序状态都将丢失。

  • 可伸缩性   应用程序状态不能在为同一应用程序服务的多个服务器间(如在网络场中)共享,也不能在同一服务器上为同一应用程序服务的多个辅助进程间(如在网络园中)共享。因此,应用程序不能依靠应用程序状态来实现在不同的服务器或进程间包含相同的应用程序状态数据。如果应用程序要在多处理器或多服务器环境中运行,可以考虑对必须在应用程序中准确保存的数据使用伸缩性更强的选项(如数据库)。

  • 并发   应用程序状态采用自由线程模式,即应用程序状态数据可由多个线程同时访问。因此,必须确保通过包含内置同步支持,以线程安全的方式进行应用程序状态数据更新。可以使用 LockUnLock 方法来确保数据的完整性,方法是锁定数据,使其一次只能由一个源进行写操作。还可以初始化 Global.asax 文件中 Application_Start 方法中的应用程序状态值,降低出现并发问题的可能性。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

请参见

任务

如何:保存应用程序状态中的值

如何:从应用程序状态中读取值

概念

ASP.NET 状态管理概述

其他资源

ASP.NET 状态管理的新增功能