asp.net浏览器缓存操作

禁止浏览器缓存
方法也很简单,就是输出日期小于当前日期就可以了,这样就简单的实现了ASP.NET禁止浏览器缓存的功能了。

 代码如下 复制代码

System.Web.HttpContext.Current.Response.BufferOutput = false;
System.Web.HttpContext.Current.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
System.Web.HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
System.Web.HttpContext.Current.Response.Expires = 0;
System.Web.HttpContext.Current.Response.CacheControl = “no-cache”;
System.Web.HttpContext.Current.Response.Cache.SetNoStore();

asp.net的浏览器缓存实现

上面我们说的是静态页面的情况,那么aspx页面,也就是动态页面会是怎么样一种情况?现在,我们创建一个动态网页来看一看。先来创建一个最简单的aspx,如下:

 代码如下 复制代码
<body>
    <%=DateTime.Now %>
</body>

请求一下,得到的头信息如下:

然后再多次请求一下,我们发现每次都是200OK,并且我们发现头信息中丢了一个很重要的信息,那就是Last-Modified。服务器没有告诉浏览器自己的对象的最后修改日期,那么浏览器就只好每次去服务器重新获取全部数据了。看到这里,我们应该明白了,要让浏览器不去拿数据,动态程序就得想法设法自己添加这个头信息。

好的,现在我们就在ASPX的后台代码中这样来实现一个最简单的头信息添加:

  

 代码如下 复制代码
      protected void Page_Load(object sender, EventArgs e)
        {
            this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
        }

添加了头信息后,我们发现再次请求URL后,头信息变为如下:

可以欣喜滴看到,响应头中包含了Last-Modified,而请求头中则包含了If-Modified-Since。

当然,我们仍旧发现,每次请求还是200OK。这是当然了,既然头信息都是ASP.NET在后台添加的,那么我们要返回什么样的响应状态给服务器这段逻辑也得由自己来写。现在,我们假设我们要让浏览器缓存10秒的时长,其完整的代码应该如下:

      

 代码如下 复制代码
  protected void Page_Load(object sender, EventArgs e)
        {           
            this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
            DateTime IfModifiedSince;
            if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))
            {
                if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 10)
                {
                    Response.Status = "304 Not Modified";
                    Response.StatusCode = 304;
                    return;
                }
            }
            //其它
        }

经过这次修改后,如果我们在10秒内持续请求该aspx页面,则始终返回304状态,也即浏览器不会去服务器拿正文,只会在本地去读取自己的缓存,这样一来,服务器压力自然就小了。如果我们10秒内不对服务器请求这个页面,则10秒后会返回200OK,即重新到服务器拿页面数据。

现在,用AB来模拟100并发用户进行1000次请求,得到的比较结果如下(注意,为了强化效果,我们在后台需要模拟一些比较耗时的动作,比如读取数据库):

左边是未做缓存的aspx页面,右边是做了缓存的aspx页面,可以看到,吞吐率相差10倍之多。

提示,使用ab进行压力测试的时候,需要加入If-Modified-Since的头信息,命令如下

asp.net mvc浏览器缓存和压缩的实现
cache在开发高可扩展性的web应用中起着至关重要的作用,我们可以按照预定的时间将任何get请求缓存到浏览器中,如果在预定的时间内用户请求同一URL那么response就会通过浏览器的cache来实现而非server。可以通过下面的action filter在ASP.NET MVC应用中实现同样的功能:

 代码如下 复制代码

using System;

using System.Web;

using System.Web.Mvc;

 

public class CacheFilterAttribute: ActionFilterAttribute

{

        /// <summary>

       /// Get or sets the cache duration in seconds . the default is 10 seconds

       /// </summary>

       /// <value> the cache duration in seconds </value>

    

      public int Duration

      {

              get;

              set;

      }

      public CacheFilterAttribute()

      {

              Duration = 10;

       }

       public override void OnActionExecuted(FiterExecutedContext filterContext)

       {

              if (Duration <= 0) return;

             

              HttpCachePolicy cache = fiterContext.HttpContext.Response.Cache;

              TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);

             

              cache.SetCacheability(Httpcacheablity.public);

              cache.SetExpires(DateTime.Now.Add(cacheDuration);

              cache.SetMaxAge(cacheDuration);

              cache.AppendCacheExtension("must revalidate, proxy-revalidate");

        }

}

可以在controller action method中应用这个filter:

 代码如下 复制代码

[CacheFilter(Duration = 60)]

public void Category(string name, int? page)

{

     

}

提升web 应用性能的另外一个重要因素便是压缩,目前大多数的浏览器都接受压缩过的内容,这样就大大节省了带宽。可以通过下面的filter在ASP.NET WEB应用中压缩你的response:

 代码如下 复制代码

using System.Web;

using System.Web.Mvc;

 

public class CompressFilter : ActionFilterAttribute

{

       public override OnActionExecuting(FilterExecutingContext filterContext)

      {

                HttpRequestBase request = filterContext.HttpContext.Request;

                string acceptEncoding = request.Headers("Accept-Encoding");

               

                if (string.IsNullOrEmpty(acceptEncoding)) return;

               

                acceptEncoding = acceptEncoding.ToUpperInvariant();

               

                HttpResponseBase response = filterContext.HttpContext.Response;

               

                if (acceptEncoding.Contains("GZIP"))

                {

                       reponse.AppendHeader("Content-encoding","gzip");

                       response.Filter = new GZipStream(response.Filter,CompressionMode.Compress);

                }

       }

}

可以在Controller action method中应用这个filter:

 代码如下 复制代码

[CompressFilter]

public void Category(string name, int? page)

{

     

}

当然也可以两个filter一块儿使用:

 

 代码如下 复制代码

[CompressFilter]

[CacheFilter(Duration = 60,Order = 2)]

public void Category(string name, int? page)

{

     

}

时间: 2024-10-15 13:00:52

asp.net浏览器缓存操作的相关文章

ASP.NET MVC中使用jQuery时的浏览器缓存问题详解_实用技巧

介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

asp.net 客户端浏览器缓存的Http头介绍_实用技巧

让浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器缓存多长时间,或者坚决不要缓存.作为.net的程序员,其实我们一直都在用这种方法,在OutputCache指令中指定缓存的Location为Client时,其实就是给浏览器发送了一个Http头,告诉浏览器这个Url要缓存多长时间,最后修改的时间. 微软在OutputCacheModule中对这些缓存用到的Http头给我们进行了很好的封装,但是了解这些Http头可以更灵活的使用它们. 和客户端缓存相关的Http头有以下几个,分别是: 1.

ASP.NET性能优化之让浏览器缓存动态网页的方法_实用技巧

OutputCache是针对所有访问服务器资源的用户,本篇要介绍的浏览器缓存则是针对单个用户,让浏览器在我们的控制下彻底不持续访问服务器上的动态内容,也就是我们要让浏览器变成我们的缓存机制中的一部分,在某些特定的场景下最大化地提升ASP.NET站点的性能.如果说OutputCache是从广度上提升并发效率,则浏览器缓存是从深度上提升效率. 一:HTTP头简介 1.1浏览器第一次请求 假设我们请求一个URL地址,譬如我服务器上的一个静态页面http://192.168.0.77/luminji2/

ASP.net里不让浏览器缓存代码和Session使用注意事项

          //不让浏览器缓存             context.Response.Buffer = true;             context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);             context.Response.AddHeader("pragma", "no-cache");             context.Response.AddHead

ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码_实用技巧

1.在系统登陆成功时记录登陆的用户名.密码等信息(登陆功能的部分代码) 复制代码 代码如下: Session["id"] = user.id.ToString(); Session["name"] = user.name.ToString(); Session["pwd"] = user.password.ToString(); Session["time"] = user.LoginTime.ToString(); Sess

asp.net页面缓存cache分析

缓存方式 ASP.NET中的缓存大体上分为两种方式:应用程序缓存和页面输出缓存.前者用编程的方式来缓存数据,这是本文主要说明的东西:后者是通过配置每个页面或是Web.config文件来实现的.而页面输出缓存有两种方式,一是缓存整个页面,一是缓存部分页面--这部分的内容以后再说.   自动移除 ASP.NET从缓存中自动移除数据的原因是以下之一: 服务器内存过低: 缓存项过期: 缓存项依赖改变.   应用程序缓存依赖 缓存依赖可以有以下几种方式:键和值依赖:文件依赖,缓存项依赖于一个外部文件,比如

浏览器缓存

  浏览器缓存   2. 缓存技术 首先要说明,很多缓存技术依赖静态化.下面展示了缓存可能出现的位置. 用户user -> 浏览器缓存 IE/Firefox Cache -> 逆向代理缓存 Reverse proxy Cache -> WEB服务器缓存 Apache cache -> 应用程序缓存 php cache -> 数据库缓存 database cache 当然交换机,网络适配器,硬盘上也有Cache 但这不是我们要讨论的范围. 缓存存储方式主要是内存和文件两种,后者

为ASP.NET应用缓存Oracle数据

asp.net|oracle|缓存|数据 为了创建可扩展.高性能的基于WEB的应用,ASP.NET提供一个称为数据缓存(Data Caching)的特性.数据缓存支持将频繁访问的数据对象可编程地存放在内存中.这一特性可扩展以广泛地提高查询Oracle数据库中数据的ASP.NET应用的性能.本文讲述一个策略,可用于采用Web Farm环境中的ASP.NET Web应用缓存Oracle数据库数据.这个技巧允许在内存中缓存频繁访问的Oracle数据库数据,而不是频繁访问数据库来取数据.这可以帮助避免到

ASP.NET 数据库缓存依赖

asp.net|缓存|数据|数据库 ASP.NET 数据库缓存依赖 By Peter A. Bromberg, Ph.D. 在ASP.NET中,Cache类最酷的特点是它能根据各种依赖来良好的控制自己的行为.以文件为基础的依赖是最有用的,文件依赖项是通过使用 Cache.Insert 并提供引用文件的 CacheDependency 对象添加的 Cache.Insert("MyData", Source, new CacheDependency(Server.MapPath("