ASP.NET状态管理之八(应用程序Application)
ASP.NET 允许您使用应用程序状态来保存每个活动的 Web 应用程序的值,应用程序状态是 HttpApplicationState 类的一个实例。
应用程序状态是一种全局存储机制,可从 Web 应用程序中的所有页面访问。因此,应用程序状态可用于存储需要在服务器往返行程之间及页请求之间维护的信息。
应用程序状态存储在一个键/值字典中,在每次请求一个特定的 URL 期间就会创建这样一个字典。可以将特定于应用程序的信息添加到此结构以在页请求期间存储它。
一旦将应用程序特定的信息添加到应用程序状态中,服务器就会管理该对象。
应用程序状态是可用于 ASP.NET 应用程序中的所有类的数据储存库。
应用程序状态存储于服务器的内存中,并且比在数据库中存储和检索数据的速度更快。
与特定于单个用户会话的会话状态不同,应用程序状态应用于所有的用户和会话。
因此,应用程序状态非常适合存储那些数量少、不随用户的变化而变化的常用数据。
应用程序状态存储于 HttpApplicationState 类中,用户首次访问应用程序中的 URL 资源时将创建该类的新实例。
HttpApplicationState 类通过 Application 属性公开。
如何:从应用程序状态中读取值
应用程序状态存储类型化为 Object 的数据。因此,即使将数据存储于应用程序状态中时不必对其进行序列化,也必须在检索数据时将其强制转换为相应的类型。
确定应用程序变量是否存在,然后在访问该变量时将其转换为相应的类型。
下面的代码示例检索应用程序状态值 AppStartTime,并将其转换为一个 DateTime 类型的、名为 appStateTime 的变量。
if (Application["AppStartTime"] != null)
{
DateTime myAppStartTime = (DateTime)Application["AppStartTime"];
}
如何:保存应用程序状态中的值
由于应用程序状态存储在服务器的内存中,因此应用程序状态中的大量数据可快速填充服务器内存。如果重新启动应用程序,应用程序状态数据便会丢失。应用程序状态无法在网络场中的多台服务器间或网络园中的辅助进程间共享。最后还请注意,应用程序状态采用自由线程模式,因此存储在应用程序状态中的任何数据必须具有内置的同步支持。
将值写入应用程序状态
在应用程序中设置 HttpApplicationState 类中变量的值。
下面的代码示例演示如何将应用程序变量 Message 设置为一个字符串。
Application["Message"] = "Welcome to the Contoso site.";
应用程序启动时将值写入应用程序状态
在应用程序 Global.asax 文件的 Application_Start 处理程序中,设置应用程序状态变量的值。同常规的 .aspx 页一样,HttpApplicationState 类也通过 Application 对象公开。
下面的代码示例演示如何将应用程序变量 Message 设置为一个字符串,并将变量 PageRequestCount 初始化为 0。
void Application_Start ( object sender , EventArgs e )
{
// 在应用程序启动时运行的代码
Application [ "Message" ] = "Welcome to the Contoso site.";
Application [ "PageRequestCount" ] = 0;
}
用锁定方法将值写入应用程序状态
在设置应用程序变量的代码中,调用 System.Web.HttpApplicationState.Lock 方法,并设置应用程序状态值,然后调用 System.Web.HttpApplicationState.UnLock 方法取消锁定应用程序状态,释放应用程序状态以供其他写入请求使用。
下面的代码示例演示如何锁定和取消锁定应用程序状态。该代码将 PageRequestCount 变量值增加 1,然后取消锁定应用程序状态。
Application.Lock();
Application["PageRequestCount"] = ((int)Application["PageRequestCount"])+1;
Application.UnLock();
应用程序状态注意事项
1.资源
由于应用程序状态存储在内存中,因此比将数据保存到磁盘或数据库中速度更快。但是,在应用程序状态中存储较大的数据块可能会耗尽服务器内存,这会导致服务器将内存分页到磁盘。除了使用应用程序状态之外,还可以使用 ASP.NET 缓存机制来存储大量的应用程序数据。ASP.NET 缓存也是将数据存储在内存中,因此速度很快;但是,ASP.NET 会对缓存进行主动管理,如果内存不足时将移除项。
2.易失性
由于应用程序状态存储在服务器内存中,因此每当停止或重新启动应用程序时应用程序状态都将丢失。例如,如果更改了 Web.config 文件,则要重新启动应用程序,此时除非将应用程序状态值写入非易失性存储媒体(如数据库)中,否则所有应用程序状态都将丢失。
3.可伸缩性
应用程序状态不能在为同一应用程序服务的多个服务器间(如在网络场中)共享,也不能在同一服务器上为同一应用程序服务的多个辅助进程间(如在网络园中)共享。因此,应用程序不能依靠应用程序状态来实现在不同的服务器或进程间包含相同的应用程序状态数据。如果应用程序要在多处理器或多服务器环境中运行,可以考虑对必须在应用程序中准确保存的数据使用伸缩性更强的选项(如数据库)。
4.并发
应用程序状态采用自由线程模式,即应用程序状态数据可由多个线程同时访问。因此,必须确保通过包含内置同步支持,以线程安全的方式进行应用程序状态数据更新。可以使用 Lock 和 UnLock 方法来确保数据的完整性,方法是锁定数据,使其一次只能由一个源进行写操作。还可以初始化 Global.asax 文件中 Application_Start 方法中的应用程序状态值,降低出现并发问题的可能性。
总结
ASP.NET 通过 HttpApplicationStatefrlrfSystemWebHttpApplicationStateClassTopic 类将应用程序状态提供为一种存储全局应用程序特定信息(对于整个应用程序都可见)的方法。应用程序状态变量实际上是 ASP.NET 应用程序的全局变量。
您可以在应用程序状态中存储应用程序特定的值,应用程序状态将由服务器来管理。
由多个会话共享并且不经常更改的数据是插入到应用程序状态变量的理想数据。
使用应用程序状态的优点
1.实现简单
应用程序状态易于使用,为 ASP 开发人员所熟悉,并且与其他 .NET Framework 类一致。
2.应用程序范围
由于应用程序状态可供应用程序中的所有页来访问,因此在应用程序状态中存储信息可能意味着仅保留信息的一个副本(例如,相对于在会话状态或在单独页中保存信息的多个副本)。
使用应用程序状态的缺点
1.应用程序范围
应用程序状态的范围可能也是一项缺点。在应用程序状态中存储的变量仅对于该应用程序正在其中运行的特定进程而言是全局的,并且每一应用程序进程可能具有不同的值。因此,不能依赖应用程序状态来存储唯一值或更新 Web 场和 Web 园服务器配置中的全局计数器。
2.数据持续性有限
因为在应用程序状态中存储的全局数据是易失的,所以如果包含这些数据的 Web 服务器进程被损坏(如因服务器崩溃、升级或关闭而损坏),将丢失这些数据。
3.资源要求
应用程序状态需要服务器内存,这可能会影响服务器的性能以及应用程序的可伸缩性。
应用程序状态的精心设计和实现可以提高 Web 应用程序性能。例如,如果将常用的、相关的静态数据集放置到应用程序状态中,则可以通过减少对数据库的数据请求总数来提高站点性能。但是,这里存在一种性能平衡。当服务器负载增加时,包含大块信息的应用程序状态变量就会降低 Web 服务器的性能。在移除或替换值之前,将不释放在应用程序状态中存储的变量所占用的内存。因此,最好只将应用程序状态变量用于更改不频繁的小型数据集。
Sql Server2005 Transact-SQL 新兵器学习总结之-总结
MS SQL数据库备份和恢复存储过程(加强版本)
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结)
WAP开发资料站(最新更新)
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现)
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)
Mcad学习笔记之序列化(2进制和Soap序列化)
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨)
WinForm开发,窗体显示和窗体传值相关知识总结
Mcad学习笔记之Microsoft Windows服务
copy某目錄下的所有的目錄和文件到目的目錄(目錄數據備份)
ASP.NET状态管理之一(概括篇)
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex
希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!