网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

使用ASP.NET AJAX启用客户端缓存

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
nbsp;   我们使用ASP.NET中的传统方法来启用客户端缓存功能:

  WebMethod]
  [ScriptMethod(UseHttpGet = true)]
  public DateTime GetServerTime()
  {
   HttpCachePolicy cache = HttpContext.Current.Response.Cache;
   cache.SetCacheability(HttpCacheability.Private);
   cache.SetExpires(DateTime.Now.AddSeconds((double)10));
   cache.SetMaxAge(new TimeSpan(0, 0, 10));
  
   return DateTime.Now;
  } 

    我们将Cacheability设为Public(Private也是可以的,如果您希望Response只为同一个客户端缓存,而不能在多个客户端共享。自然这是为有中间结点的情况服务的,例如通过代理服务器请求资源),并且指定了一个10秒钟的过期时间。我们同样调用了SetMaxAge方法将max-age的值设为10秒钟,因为ASP.NET AJAX在这之前已经将它设为了零(TimeSpan.Zero)。让我们来看一下效果……缓存失败?我们随意挑一个Response查看一下它的Header。

  Cache-Control public, max-age=0
  Date Fri, 29 Jun 2007 00:44:14 GMT
  Expires Fri, 29 Jun 2007 00:44:24 GMT 
 

 

    问题就在于Cache-Control中的max-age的值被设为了0。我们已经将其设为了10秒但是它依旧是零的原因则在于HttpCachePolicy中SetMaxAge方法的实现上:


  public void SetMaxAge(TimeSpan delta)
  {
   if (delta < TimeSpan.Zero)
   {
   throw new ArgumentOutOfRangeException("delta");
   }
   if (s_oneYear < delta)
   {
   delta = s_oneYear;
   }
   if (!this._isMaxAgeSet || (delta < this._maxAge))
   {
   this.Dirtied();
   this._maxAge = delta;
   this._isMaxAgeSet = true;
   }
  }  

    一旦我们调用了SetMaxAge方法之后,_isMaxAgeSet标记就被设为了true,它组织_maxAge变量被设为比当前小的值。当我们在执行Script Method时,_isMaxAgeSet标记已经是true,并且_maxAge变量的值为Time.Zero,因此我们已经不能将其改变成其它的值了(Omar大牛在之前的某篇文章中认为不能改变max-age是因为ASP.NET 2.0的Bug,其实并非这样)。到了使用反射机制的时候了。我们要做的就是直接改变_maxAge变量的值。

  [WebMethod]
  [ScriptMethod(UseHttpGet = true)]
  public DateTime GetServerTime()
  {
   HttpCachePolicy cache = HttpContext.Current.Response.Cache;
   cache.SetCacheability(HttpCacheability.Private);
   cache.SetExpires(DateTime.Now.AddSeconds((double)10));
  
   FieldInfo maxAgeField = cache.GetType().GetField(
   "_maxAge", BindingFlags.Instance | BindingFlags.NonPublic);
   maxAgeField.SetValue(cache, new TimeSpan(0, 0, 10));
  
   return DateTime.Now;
  } 
 

    我们检验一下缓存的效果:
  
  


   似乎和之前没有什么两样,但是HttpWatch能够告诉我们个中区别:

  • 上一篇资讯: 如何实现站点的RSS输出
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号