您的位置:首页 > 编程语言 > ASP

ASP.NET 应用程序状态概览

2007-01-21 22:53 267 查看
应用程序状态是一个能够被 ASP.NET 应用程序中的所有类都可用的数据贮存室。应用程序状态被存储在服务器的内存中并且速度要比从数据库中存储并获取信息时要来得更快。与会话状态不同,会话状态只指定了单独的用户会话,而应用程序状态会作用于所有的用户和会话。因此,应用程序状态在存放少量经常被使用并且不会在用户之间被更改的数据存储的时候是比较适用的。关于保存每用户基本数据的信息,请参考:[会话状态概览和 ASP.NET 档案属性概览]。

使用应用程序状态

应用程序状态被存储在 HttpApplicationState 类的一个实例中。这个类暴露了一个 Key/Value 的字典对象。

HttpApplicationState 实例在用户第一次对应用程序中的任何 URL 资源进行访问的时候被创建。HttpApplicationState 类经常通过使用 HttpContext 类的 Application 属性的方式被访问。

你可以通过两种方式来使用应用程序状态。你可以直接通过代码来添加、访问,或者删除 Contents 集合中的值。HttpApplicationState 类能够在应用程序的生命周期中的任何时间段被访问。因此,它经常被用来在应用程序启动的时候载入应用程序状态数据。要这样做,你可以把用来载入应用程序状态的代码存放到 Global.asax 文件的 Application_Start 方法中。关于更多信息,请参考:[ASP.NET 应用程序生命周期的概览]。

另外,你可以通过一个 <object runat="server"> 声明把对象添加到 Web 应用程序的 Global.asax 文件中的 StaticObjects 集合中。这时候,通过这种方式被定义的应用程序状态就能够被应用程序中任何位置的代码所访问。如下范例说明了一个应用程序状态值的对象声明:

<object runat="server" scope="application" ID="MyInfo"
PROGID="MSWC.MYINFO">
</object>
你只能够在 Global.asax 文件中才可以把对象添加到 StaticObjects 集合中。如果你尝试通过代码来直接把对象添加到该集合中,那么它将会抛出一个 NoSupportedException 异常。

你可以不对 Application 集合进行引用就可以访问到被存储在应用程序状态中的对象成员。如下代码范例说明了如何引用被定义在应用程序状态的 StaticObjects 集合中的对象的成员:

protected void Page_Load(Object sender, EventArgs e)
{
Label1.Text = MyInfo.Title;
}

应用程序状态的注意事项

在使用应用程序状态的时候,你必须要了解如下所示的重要注意事项:

资源。因为应用程序状态是被存储在内存中的,所以访问的速度远远快于被保存在磁盘或者数据库中的数据。但是,在应用程序状态中所存储的庞大数据能够淤积在服务器的内存中,并会导致服务器把页面缓存到磁盘中。作为使用应用程序状态的一种替代方式,你可以为存储庞大数据的应用程序数据而使用 ASP.NET 高速缓存机制。ASP.NET 高速缓存同样也是把数据存储在内存中的,因此速度也非常快;但是,ASP.NET 会积极地对高速缓存进行管理并在内存不足的时候删除相应的数据项。更多信息请参考:[ASP.NET 高速缓存概览]。

挥发性。因为应用程序状态被存储在服务器的内存中,因此会在应用程序被中止或被重启的时候被丢失。例如,如果 Web.config 文件被改变,应用程序就会被重启,并且任何没有被写入到一个稳定存储媒体(如数据库)中的应用程序状态数据都将被丢失。

伸缩性。应用程序状态不能在为相同应用程序提供服务的多个服务器之间被共享(如 Web 农场),或者是为相同服务器的相同应用程序提供服务的多个工作者进程之间(如 Web 花园)。因此你的应用程序不能够依赖于为跨不同服务器或进程的应用程序状态而包含相同数据的应用程序状态。如果你的应用程序将运行在多进程或多服务器的环境中,为了保持跨应用程序间的数据的保真度,就需要考虑使用更多的可伸缩选项(如数据库)。

并发性。应用程序状态是基于自由线程的,这表示应用程序状态数据能够被多个线程同时进行访问。因此,确保在更新应用程序状态数据的时候,在通过包括内建同步支持的线程安全风格中这样做是重要的。你可以通过使用 Lock 和 UnLock 方法锁定数据并只允许同一时间只能够被一个源进行写入的方式来确保数据的完整性。你同样可以减少通过在 Global.asax 文件的 Application_Start 方法中初始化应用程序状态值的时候出现并发问题的可能性。更多信息请参考:[ASP.NET 应用程序生命周期概览]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: