ASP.Net 更新页面输出缓存的几种方法

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() 中判断多个关键字,以控制不同的用户控件输出缓存。

---------另一方法--------------

ASP.NET输出缓存的使用网上已经有很多例子了,这里主要介绍下如何在后台管理中移除缓存。

1.基于页面缓存

对于页面:Default.aspx 如果页面顶部添加:

<%@ OutputCache Duration="60" VaryByParam="none" %>

在后台管理中要移除很简单:

System.Web.HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("Default.aspx"));

2.基于控件

对于控件WebUserControl.ascx 如果在顶部添加了

<%@ OutputCache Duration="60" VaryByParam="none" Shared="true"%>

在后台管理中要实现的话有点麻烦,在博客园的博问请朋友们解答,查尔斯提供了一种解决方法。

实现如下:

(1)添加VaryByCustom项,值为Cashgroupclass。

<%@ OutputCache Duration="60" VaryByParam="none" Shared="true" VaryByCustom="Cashgroupclass" %>

(2) 在Global.asax 中重写 GetVaryByCustomString 方法,代码如下:

代码 
public override string GetVaryByCustomString(HttpContext context, string arg) 

   if (arg == "Cashgroupclass") 
   { 
       Cache objCache = HttpRuntime.Cache; 
       Object _flag = objCache["Cashgroupclass"]; 
       if (_flag == null) 
       { 
           _flag = DateTime.Now.Ticks.ToString(); 
           objCache.Insert("Cashgroupclass", _flag); 
       } 
       return _flag.ToString(); 
   } 
   return base.GetVaryByCustomString(context, arg); 
}

(3)在后台管理的移除页面添加如下代码:

Cache objCache = HttpRuntime.Cache; 
if (objCache["Cashgroupclass"] != null) 

    objCache.Remove("Cashgroupclass"); 
}

当然,您也可以借助这个方法实现控件的缓存更新。对了,查尔斯贴的代码中有使用DataCache类,是个自己写的类,可以参考DataCache ,不过里面重载参数对不上。那就加一个吧。

代码 
public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration) 

      HttpRuntime.Cache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration); 
}

最后,感谢朋友们对我的帮助。

时间: 2024-09-30 07:03:39

ASP.Net 更新页面输出缓存的几种方法的相关文章

页面输出消息的5种方法

1)alert("")在页面弹窗中显示消息 2)confirm("")弹窗显示与if-else等条件分支语句配合使用 function confirmFun(){ var flag = confirm('选择确定或取消'); if(flag){ alert('您选择了确定'); }else{ alert('您选择了取消'); } }  3)prompt("")接收用户输入的弹窗 var name = prompt('请输入您的名字'); cons

Jsp页面跳转和js控制页面跳转的几种方法

Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet或者是JSP到另外的一个Servlet.JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递. 但forward()无法重定向至有frame的jsp文件,可以重定向至有

js清除浏览器缓存的几种方法

关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些 错误的数据.像股票类网站实时更新等,这样的网站是不要缓存的,像有的网站很少更新,有缓存还是比较好的.今天主要介绍清除缓存的几种方法. 清理网站缓存的几种方法 meta方法 //不缓存 <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP

HTML 页面跳转的五种方法

H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <head><!-- 以下方式只是刷新不跳转到其他页面 --><meta http-equiv="refresh" content="10"><!-- 以下方式定时转到其他页面 --><meta http-equiv="

rman输出日志的几种方法(转)

在使用rman的时候经常会碰到以下两种场景,需要把rman的日志输出到文件中: 1.显示的日志太多,导致一个屏幕显示不完,影响了问题的诊断,这时候需要把rman的log输出到文本中,整个的诊断过程就相对容易了许多. 2.在使用自动备份的时候,需要把日志输出到文本中,便于第二天进行备份任务的检查: 一.简单的日志数据的脚本 rman target / log /usr/oracle/rman.log 该脚本直接把rman的日志写到/u01/,并命名为rman.log,但是使用这种方法的时候,屏幕不

iOS清理缓存的几种方法

iOS清理缓存的几种方法,有需要的朋友可以参考下: 1.计算文件大小: - (long long) fileSizeAtPath:(NSString*) filePath{ NSFileManager* manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath:filePath]){ return [[manager attributesOfItemAtPath:filePath error:nil] file

HTML中button标签点击实现页面跳转的三种方法

方法1:使用onclick事件12<input type="button" value="按钮"onclick="javascrtpt:window.location.href='http://www.9252.com/'" /> 或者直接使用button标签1<button onclick="window.location.href = 'https://www.9252.com/'">儿童</

asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交 (2)特殊方式提交 2.控制器处理表单数据的四种方法 方法1:使用传统的Request请求数据 方法2:Action参数名与表单元素name值一一对应 方法3:从MVC封装的FormCollection容器中读取 方法4:使用实体作为Action参数传入,前提是提交的表单元素名称与实体属性名称一一对应 控制器源码 using MvcStudy.Models;u

【转】asp.net导出数据到Excel的三种方法

来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/cpp2017/article/details/2244368 asp.net导出到Excel也是个老生常谈的问题,在此归纳一下. 第一种是比较常用的方法.是利用控件的RenderControl功能,得到该控件生成的HTML,然后以Excel文件的类型输出到客户端.这种方法生成的其实是个HTML文件