ASP.NET 状态管理(Application)

转载自:http://www.cnblogs.com/SkySoot/archive/2012/07/13/2590256.html

应用程序状态允许保存被所有客户访问的全局对象。应用程序状态基于 System.Web.HttpApplicationState 类,该类在 Web 页面中通过内建的 Application 对象提供。

例如,可以创建一个 global.asax 事件处理程序来跟踪有多少会话被创建了,也可以使用相同的逻辑追踪某一页面的访问次数:

protected void Page_Load(object sender, EventArgs e)
{
    int count = 0;
    if (Application["HitCounterForOrderPage"] != null)
    {
        count = (int)Application["HitCounterForOrderPage"];
        count++;
        Application["HitCounterForOrderPage"] = count;
    }
}

应用程序状态用对象类型保存状态项,所有集合中取值需要转换类型。应用程序状态中项目从不过期,一直被保存到应用程序或服务器重启。

应用程序状态不太经常使用,因为效率不高。在上一个例子中,计数器的数字不精确,大量用户同时访问时,会丢失计数。为了避免这个情况的出现,可以使用 Lock()和 UnLock()方法,它们禁止用户同时访问 Application 集合:

protected void Page_Load(object sender, EventArgs e)
{
    Application.Lock();
    int count = 0;
    if (Application["HitCounterForOrderPage"] != null)
    {
        count = (int)Application["HitCounterForOrderPage"];
        count++;
        Application["HitCounterForOrderPage"] = count;
    }
    Application.UnLock();
}

遗憾的是,所有请求该页面的用户都将被暂停直到 Application 集合被释放。这会大大的降低性能。一般而言,经常改变的值不适合放到应用程序状态中。

事实上,ASP.NET 中极少使用应用程序状态,因为它的两个最常用的功能已经被更简单,更有效的方法替代了:

  • 以前,人们使用应用程序状态来保存应用程序级别的常量,如数据库连接字符串。现在这类常量可以保存在web.config中,它通常更为灵活,因为它易于修改而不需要更改代码或重新编译应用程序
  • 应用程序状态还可以用来保存常用但创建较费时的信息,比如进行数据库查询全部产品目录。但现在更相似,明智的做法是在 ASP.NET 的缓存中保存常用的信息。应用程序状态的很多应用可以使用缓存有效替换

静态应用程序变量

还可以在 global.asax 文件中添加静态成员变量

public static string[] FileList;

这能够起作用的关键在于变量时静态的。因为 ASP.NET 创建 HttpApplication 类的连接池来服务多个请求。这样,每次请求都可能由不同的 HttpApplication 对象来服务,每个 HttpApplication 对象都有自己的实例数据,然而,静态数据的副本只有一份。

仍然存在多个页面会调用这个静态变量的可能性,但是由于不是 Application 对象因此没有了自动锁,所以应该使用 C# 的锁语句来临时将变量限定于某个单独的线程里

private static Dictionary<string, string> metadata = new Dictionary<string, string>();
 
public void AddMetadata(string key, string value)
{
    lock (metadata)
    {
        metadata[key] = value;
    }
}
 
public string GetMetadata(string key)
{
    lock (metadata)
    {
        return metadata[key];
    }
}

使用静态成员变量而不使用 Application 集合有两大优势

  • 首先,在值被访问或修改时(通过在属性过程或者方法中绑定数据),它允许你编写可自动运行的编码。可以使用这段代码记录某个值被访问了多少次,可以检查数据是否依然有效,或者是否需要重新创建。这个示例使用延迟初始化模式,且仅在第一次请求时创建全局对象:
private static string[] fileList;
public static string[] FileList
{
    get
    {
        if (fileList == null)
        {
            fileList = Directory.GetFiles(HttpContext.Current.Request.PhysicalApplicationPath);
        }
        return fileList;
    }
}
// 这个示例使用文件访问类来读取 Web 应用程序的文件列表
// 这个功能不可能通过 Application 集合实现
  • 使用静态成员变量的另一个好处是类型安全,从 Global 类中取得的变量类型不需要转换。
时间: 2025-01-01 08:44:14

ASP.NET 状态管理(Application)的相关文章

ASP.NET状态管理详解,让你明明白白

开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协议对ASP.NET应用程序发出请求,ASP.NET应用程序响应用户请求,向客户端发送请求的HTML代码,服务器并不会维护任何客户端状态.考虑一个有成千上万并发用户的服务器,如果为每一个用户都维护状态的话会耗费非常多的资源. 由于使用无状态的http协议作为web应用程序的通信协议,当客户端每次请求页

[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了.当客户在20分钟之内没有访问服务器,会话结束,销毁session.(当然也可以在Web.config中设置缓存时间)可以在Global.aspx的Session_Start()事件处理程序中,可以初始化会话变量.在下面的实例中,名为mydata的会话状态被初始化为0: 运行结果: 2.Session是保存在服务器端的用户变量.我可以在一个页面中对Session进行值,然后在另一个页面里访问它. Session的

实验五 ASP.NET状态管理和应用程序配置 总结

这次实验内容是对ASP.NET配置系统的了解和使用,还有就是对Application.Session.ViewState对象的应用.首先,我想说ASP.NET配置系统真的大大超乎我的想象,我以为会是上学期JSP那样,在xml或者一些配置文件里面手动输入一些需要的变量属性.但是结果并不是,而是可以通过可视化的界面,通过非常友好的方式进行变量的添加和赋值,非常非常的方便.只要输入想要设置的变量名字,值.再刷新一下web.config文件,就会发现里面已经帮我们写好了我们想要的变量.当然,还可以把数据

ASP.NET状态管理之四(暂存状态HttpContext.Items)

ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items 暂存状态就是利用HttpContext.Items属性来存放数据 MSDN中HttpContext.Items属性的解释是这样的:获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值 HttpContext.Items属性中可以存放任何类型数据,无论这个属性中存放什么数据,都会在请求处理结束后自动清除,这就是暂存状态,

ASP.NET-【状态管理】-Cookie小结

Cookie路径 谷歌浏览器 依次点击设置--高级选项--内容设置--cookies--选择“显示cookies和其他网站数据”按钮就可以看到了 C:\Users\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default IE浏览器 C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files 注意:只

Asp.net Web 状态管理

最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望对园友有帮助,这是一件很开心的事情 4. 希望大侠们看到问题及时帮忙指正,不想误导自己,更不想误导园友,在下不胜感激 不再磨叽,马上上菜 名称 用户 生存时间 数据 位置 优势 劣势 建议 Application 所有用户 应用程序重新启动 没有限制,只被存储一次 服务器,可以存储在数据库 1. 实

ASP.NET Web – 状态管理

状态类型 客户端或服务器资源 有效时间 ViewState 客户端 只在一个页面中 Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上 Session 服务器 会话状态与浏览器相关.会话在超时(默认为20分钟)后变得无效 Application 服务器 在所有的客户端上共享应用程序状态,这个状态在服务器重新启动之前都是有效的 Cache 服务器 类似于应用程序状态,缓存是共享的.但是,使缓存无效有更好的控制方式 客户端的状态管理 -ViewState

ASP.NET Core——状态管理之视图状态

在实际项目中,常常需要保存用户信息来简化掉一些不必要的重复动作,提供人性化和智能的交互方式.然而HTTP协议是无状态的,每个新页面请求都是接.ASP.NET提供了保存状态的不同选项,使得状态额可以在客户端或服务器上保存. 要在客户端保存状态,ASP.NET提供了视图状态.cookie和参数选项.因为安全问题,使用这些状态有一些限制.在服务器端可以使用会话对象.全局应用程序状态.缓存和用户配置文件来保存状态. ASP.NET也提供了一些用于访问状态管理功能的属性.例如,HttpSessionSta

C#实例之简单聊天室(状态管理)

前言        状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生成一个网页实例.此时,旧网页的任务完成,旧网页的实例也随之消失.这种无状态,意味着客户端用户在浏览器中的一些状态或是对数据的一些修改都将丢失. 为了弥补这种基于web应用程序的固有限制,ASP.NET提供了多种用于管理状态的功能. 简单聊天室 这里运用System.Web命名空间的那些管理状态的类,