技术开发 频道

ASP.NET性能提升之浏览器缓存的调用

  【IT168 专稿】 

  浏览器中进行的缓存 AJAX调用

  浏览器能够在用户的硬盘驱动器上缓存图片、JavaScript、CSS文件,并且如果该调用是一个HTTP  GET请求,它也能够缓存XML HTTP调用,缓存基于URL。如果是相同的URL,则会缓存到计算机上,然后当再次请求时从缓存中加载响应,而不是从服务器上加载。基本上,浏览器能够缓存调用的任何HTTP GET并基于URL返回缓存数据。

  第一篇:ASP.NET性能提升秘诀之管道与进程优化 

  第二篇:ASP.NET性能提升之站点部署与内容传输

  如果以HTTP GET的方式进行一次XML HTTP的调用,服务器则会返回一些特殊的头,并告知浏览器缓存这些响应,在将来调用时,响应便立即从缓存中返回,因此节约了网络之间的往返和数据的下载时间。

  在Pageflakes站点上,我们缓存了用户的状态以便当用户第二天再次访问站点,用户从浏览器缓存中获得一个加载实例的缓存页面,二不是从服务器上获取。因此第二次加载会变得非常快。我们也缓存了很多页面上的小部分,这些部分出现在用户的活动中。当用户再次执行相同活动时,缓存的内容就会从本地缓存中立即加载,因此节约了网络带宽时间。用户在站点上获得了更快的速度并得到了快速的响应。会感觉到速度明显有所增加。

  这样做是为了当对Atlas Web服务调用时进行HTTP GET调用并返回一些指定的HTTP响应头以告知浏览器缓存这些响应一段时间。如果在响应期间返回期满头,浏览器将缓存XML HTTP响应。这里有两种你需要返回的头来响应:

  HTTP/1.1 200 OK
  Expires: Fri,
1 Jan 2030
  Cache
-Control: public

  这表示浏览器缓存响应到2030年1月。只要你使用相同的参数发出相同的XML HTTP调用,你将可以从计算机上获得缓存的响应并且不会调用源服务器。这里有更多的高级方式来获得响应缓存的控制。例如,虽然这里头指示出浏览器将缓存60秒,但是60秒后会连接到服务器并获得一个刷新的响应。当浏览器本地缓存期满60秒后,系统也会阻止代理返回缓存响应。

HTTP/1.1 200 OK
  Cache
-Control: private, must-revalidate, proxy-revalidate, max-age=60

  咱们试着从ASP.NET Web服务调用产生这种响应头:

[WebMethod][ScriptMethod(UseHttpGet=true)]
public string CachedGet()
{
    TimeSpan cacheDuration
= TimeSpan.FromMinutes(1);
    Context.Response.Cache.SetCacheability(HttpCacheability.Public);
    Context.Response.Cache.SetExpires(DateTime.Now.Add(cacheDuration));
    Context.Response.Cache.SetMaxAge(cacheDuration);
    Context.Response.Cache.AppendCacheExtension(
          
"must-revalidate, proxy-revalidate");
    
return DateTime.Now.ToString();
}

  下面的响应头中展示了这一结果: 



  虽然期满头进行了正确的设置,但是问题出在了Cache-control。Max-age设置为0表示系统将会阻止浏览器进行各种缓存操作。如果你确实想要阻止缓存,你应该发生这种缓存控制头。

  该输出是不正确的,并且没有缓存:

0
相关文章