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); 
}
最后,感谢朋友们对我的帮助。

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

  1. ASP.NET缓存全解析2:页面输出缓存 转自网络原文作者李天平

    页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中.当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期.在这个过程中,缓存内容直接发送给用户,而不必再次 ...

  2. c#ASP.NET中页面传值共有这么几种方式

    一.目前在ASP.NET中页面传值共有这么几种方式: 1.Response.Redirect("http://www.hao123.com",false); 目标页面和原页面可以在 ...

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

    Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...

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

    2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数 ...

  5. 在ASP.NET Core中构建路由的5种方法

    原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...

  6. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  7. js 控制页面跳转的5种方法

    js 控制页面跳转的5种方法 编程式导航: 点击跳转路由,称编程式导航,用js编写代码跳转. History是bom中的 History.back是回退一页 Histiory.go(1)前进一页 Hi ...

  8. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  9. 实现网页页面跳转的几种方法(meta标签、js实现、php实现)

    1.meta标签实现 只需在head里加上下面这一句就行了,在当前页面停留0.1秒后跳转到目标页面  代码如下 复制代码 1 <meta http-equiv="refresh&quo ...

随机推荐

  1. html5响应式

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = ‘orientationchange’ in window ? ...

  2. AJPFX辨析GBK和UTF8的区别

    GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符. UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多 ...

  3. linux安装源文件(.tar.gz)

    安装此类文件,分为7步: 1.首先把依赖的软件给装上,如果依赖perl,先装perl,如果依赖Pathon,现装pathon 2.tar 源软件路径 -C 新软件路径(注意这里一定要-C,不然不能解压 ...

  4. rest_framework组件之认证,权限,访问频率

    共用的models from django.db import models # Create your models here. class User(models.Model): username ...

  5. SpringBoot 数据库操作 增删改查

    1.pom添加依赖 <!--数据库相关配置--> <dependency> <groupId>org.springframework.boot</groupI ...

  6. css简单动画

    这几天公司需要更新一个移动端web的页面,因为任务简单,就交给作为菜鸟新人的我来做.第一次接触css还是在14年刚上大一的时候跟着html一起学习的,之后就再也没有接触过.所以只好一边学习,一边完成任 ...

  7. i-nex安装教程

    sudo add-apt-repository ppa:i-nex-development-team/stable sudo apt-get updatesudo apt-get i-nex

  8. 洛谷 P2691 逃离

    题目描述 一个n×n栅格是由n行和n列顶点组成的一个无向图,如图所示.用(i,j)表示处于第i行第j列的顶点.除了边界顶点(即满足i=1,i=n,j=1或j=n的顶点(i,j)),栅格中的所有其他顶点 ...

  9. 如何对ABAP SE80 workbench做增强

    流程如下: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  10. ping请求超(iPV4)

    ping请求超(iPV4) arp –a(查看局域网全部IP) cmd 管理员运行 netsh winsock reset(重置Winsock目录借以恢复网络) etsh int ip reset r ...