在发布或更新网站进行测试时,往往会遇到一些小问题,而往往这些小问题也就反映了自己基础的不扎实。在这里给自己补补课。
今天更新了一个网站,其中网站用到了Application对象,里面存了个Boolean值,是用来判断系统是否已经注册的(在Global.asax中判断是否已经注册,然后更新该值)。当把最新的DLL文件覆盖原有旧文件后,发现网站跳转到注册页面。这就奇怪了,Application对象不是全局的,整个应用程序生命周期中都存储在内存中吗? 赶紧查看了MSDN,原来没考虑到Application对象的“易失性”。
参考MSDN原文(http://msdn.microsoft.com/zh-cn/library/ms178594.aspx)
使用应用程序状态时,必须注意以下重要事项:
资源 由于应用程序状态存储在内存中,因此比将数据保存到磁盘或数据库中速度更快。 但是,在应用程序状态中存储较大的数据块可能会耗尽服务器内存,这会导致服务器将内存分页到磁盘。 除了使用应用程序状态之外,还可以使用 ASP.NET 缓存机制来存储大量的应用程序数据。 ASP.NET 缓存也是将数据存储在内存中,因此速度很快;但是,ASP.NET 会对缓存进行主动管理,如果内存不足时将移除项。 有关更多信息,请参见 ASP.NET 缓存概述。
易失性 由于应用程序状态存储在服务器内存中,因此每当停止或重新启动应用程序时应用程序状态都将丢失。 例如,如果更改了 Web.config 文件,则要重新启动应用程序,此时除非将应用程序状态值写入非易失性存储媒体(如数据库)中,否则所有应用程序状态都将丢失。
可伸缩性 应用程序状态不能在为同一应用程序服务的多个服务器间(如在网络场中)共享,也不能在同一服务器上为同一应用程序服务的多个辅助进程间(如在网络园中)共享。 因此,应用程序不能依靠应用程序状态来实现在不同的服务器或进程间包含相同的应用程序状态数据。 如果应用程序要在多处理器或多服务器环境中运行,可以考虑对必须在应用程序中准确保存的数据使用伸缩性更强的选项(如数据库)。
并发 应用程序状态采用自由线程模式,即应用程序状态数据可由多个线程同时访问。 因此,必须确保通过包含内置同步支持,以线程安全的方式进行应用程序状态数据更新。 可以使用 Lock 和 UnLock 方法来确保数据的完整性,方法是锁定数据,使其一次只能由一个源进行写操作。 还可以初始化 Global.asax 文件中 Application_Start 方法中的应用程序状态值,降低出现并发问题的可能性。