zoukankan      html  css  js  c++  java
  • ASP.Net 常用缓存更新(转)

    ASP.Net 更新页面输出缓存的几种方法(包括用户控件,iframe,页面缓存等)

    ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟。如何快速更新缓存数据,有时成了困扰程序员的难题。根据我的使用经验,总结了下面几种方法,概括了常见的几种情况,如有更好的方法欢迎补充。
    (1)Cache 对象缓存
    Cache 对象提供代码级的缓存,功能强大,可操作性强。更新这种缓存的方法很简单,只要调用 Cache.Remove(key) 方法就可以清除指定的缓存。代码如下:
    HttpRuntime.Cache.Remove(cacheEnmu.Key.ToString());
    下列代码清空所有 Cache 缓存:
    IDictionaryEnumerator cacheEnmu = HttpRuntime.Cache.GetEnumerator();
    while (cacheEnmu.MoveNext())
    {
       HttpRuntime.Cache.Remove(cacheEnmu.Key.ToString());
    }
    (2)页面级缓存 OutputCache
    相对 Cache 对象,页面级的 OutputCache 的使用要容易得多,且无需改动页面代码,只要在页面顶部增加 <%@ OutputCache %> 声明就可以缓存当前页的所有内容。当然有利必有弊,OutputCache 只提供有限的几个参数,当需要清除缓存时就不如 Cache 对象那么灵活。不过仍然有办法,.Net 提供了 RemoveOutputCacheItem() 方法来清空页面级输出缓存,使用方法如下:
    HttpResponse.RemoveOutputCacheItem(fname);
    //fname 是待清除缓存页面的绝对路径,如 /article/read.aspx
    (3)用户控件级缓存 OutputCache
    用户控件级缓存和页面级缓存类似,不同的是可以只缓存页面局部的用户控件,对于不需要整页缓存的页面来说是种不错的解决方案。可是清空页面缓存的 RemoveOutputCacheItem() 方法对用户控件却无效。查阅了很多资料,结论是 .net 没有提供直接清空用户控件输出缓存的方法。我的方法是采用 OutputCache 依赖项变通处理,OutputCache 有一个 VaryByCustom 参数,用于为缓存指定自定义的依赖项,当该项内容变动时就会更新缓存。要使用 VaryByCustom 参数需要重写 Global.asax 的 GetVaryByCustomString() 方法,简单的代码如下:
    //arg 是系统传入的自定义变量名,需要在下面进行判断//DataCache 是一个缓存类,这里用于存取 Cache 对象,当更新该Cache对象时,页面缓存同时更新
    public override string GetVaryByCustomString(HttpContext context, string arg)
    {
      if(arg == "ucCacheFlag")
      {
      Object _flag = DataCache.GetCache("ucCacheFlag");
        if(_flag == null)
        {
            _flag = DateTime.Now.Ticks.ToString();
            DataCache.SetCache( "ucCacheFlag", _flag,DateTime.Now.AddMinutes(CommonValue.CacheTime),TimeSpan.Zero);  
        }
        return _flag.ToString();
      } 
      return base.GetVaryByCustomString(context, arg);
    }
    同时在用户控件的头部声明中加入:
    <%@ OutputCache Duration="1800" VaryByCustom="ucCacheFlag" %>
    //ucCacheFlag 就是在GetVaryByCustomString()中判断的字符串
    只需在程序中更新 key 为 ucCacheFlag 的 Cache,页面输出缓存也会相应更新。可以在 GetVaryByCustomString() 中判断多个关键字,以控制不同的用户控件输出缓存。
    (4)iframe 中的缓存问题
    嵌入 iframe 或网页模式对话框中的页面会自动产生输出缓存,导致内部页不能实时,这是IE自带的缓存机制,严格来说与 ASP.Net 无关。不过在 .Net 中我们可以通过简单的代码解决这个问题。
    在程序的开头部分加入下面的代码,可以设置 HTTP 请求立刻更新,阻止 IE 对页面进行缓存。
    Response.Expires = -1;
    常见的缓存问题就是以上四种,如果有更好的方法,欢迎在此留言。
  • 相关阅读:
    项目管理软件选择:redmine or JIRA
    为已编译的DLL附带强命名
    NET简单的一个画图程序
    公共的Json操作类
    ASP.NET 程序优化
    提高ASP.NET页面载入速度的方法
    DataTable快速定制之Expression属性表达式
    TCP和UDP Client 代码
    Jquery实现异步上传图片
    C语言Socket编程(计算机网络作业)
  • 原文地址:https://www.cnblogs.com/sishahu/p/2174539.html
Copyright © 2011-2022 走看看