千家信息网

ASP.NET清空缓存的功能介绍

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章主要介绍"ASP.NET清空缓存的功能介绍",在日常操作中,相信很多人在ASP.NET清空缓存的功能介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"ASP.N
千家信息网最后更新 2024年11月24日ASP.NET清空缓存的功能介绍

这篇文章主要介绍"ASP.NET清空缓存的功能介绍",在日常操作中,相信很多人在ASP.NET清空缓存的功能介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"ASP.NET清空缓存的功能介绍"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在网站中要做一个清理缓存的功能(也就是在缓存为到期之前就强制缓存过期),程序中有的地方使用的HttpRuntime.Cache来做的缓存,而和数据库交互部分则使用ObjectDataSource提供的缓存机制。清理HttpRuntime.Cache的缓存很简单,只要

List keys = new List();    // retrieve application Cache enumerator IDictionaryEnumerator enumerator = HttpRuntime.Cache.GetEnumerator();    // copy all keys that currently exist in Cache    while (enumerator.MoveNext())    {     keys.Add(enumerator.Key.ToString());    }    // delete every key from cache    for (int i = 0; i < keys.Count; i++)    {     HttpRuntime.Cache.Remove(keys[i]);    }

就可以了。

本以为ObjectDataSource等数据源的缓存也是保存在HttpRuntime.Cache中,经过测试没想到竟然不是,因为执行上面的代码以后ObjectDataSource仍然是从缓存读取数据。

使用Reflector反编译发现ObjectDataSource是使用HttpRuntime.CacheInternal来实现的缓存。CacheInternal是internal的,因此没法直接写代码调用,同时CacheInternal中也没提供清空缓存的方法,只能通过实验发现_caches._entries是保存缓存的Hashtable,因此就用反射的方法调用CacheInternal,然后拿到_caches._entries,最后clear才算ok。

最终代码如下:

//HttpRuntime下的CacheInternal属性(Internal的,内存中是CacheMulti类型)是ObjectDataSource等DataSource保存缓存的管理器 //因为CacheInternal、_caches、_entries等都是internal或者private的,所以只能通过反射调用,而且可能会随着.Net升级而失效  object cacheIntern = CommonHelper.GetPropertyValue(typeof(HttpRuntime), "CacheInternal") as IEnumerable;  //_caches是CacheMulti中保存多CacheSingle的一个IEnumerable字段。  IEnumerable _caches = CommonHelper.GetFieldValue(cacheIntern, "_caches") as IEnumerable;  foreach (object cacheSingle in _caches)  {   ClearCacheInternal(cacheSingle);  }  private static void ClearCacheInternal(object cacheSingle) {  //_entries是cacheSingle中保存缓存数据的一个private Hashtable  Hashtable _entries = CommonHelper.GetFieldValue(cacheSingle, "_entries") as Hashtable;  _entries.Clear(); }  mary> /// 得到type类型的静态属性propertyName的值 ///  ///  ///  ///  public static object GetPropertyValue(Type type, string propertyName) {  foreach (PropertyInfo rInfo in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance))  {   if (rInfo.Name == propertyName)   {    return rInfo.GetValue(null, new object[0]);   }  }  throw new Exception("无法找到属性:" + propertyName); }  ///  /// 得到object对象的propertyName属性的值 ///  ///  ///  ///  public static object GetPropertyValue(object obj, string propertyName) {  Type type = obj.GetType();  foreach (PropertyInfo rInfo in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance))  {   if (rInfo.Name == propertyName)   {    return rInfo.GetValue(obj, new object[0]);   }  }  throw new Exception("无法找到属性:" + propertyName); }  public static object GetFieldValue(object obj, string fieldName) {  Type type = obj.GetType();  foreach (FieldInfo rInfo in type.GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance))  {   if (rInfo.Name == fieldName)   {    return rInfo.GetValue(obj);   }  }  throw new Exception("无法找到字段:" + fieldName); }

上面方法由于是通过crack的方法进行调用,可能有潜在的问题,因此仅供参考。

在google上搜索到另外一篇文章,主干是代码,代码的思路和我一样,贴过来也供参考。

private void clearOutputCache() {  Type ct = this.Cache.GetType();  FieldInfo cif = ct.GetField( "_cacheInternal", BindingFlags.NonPublic | BindingFlags.Instance );  Type cmt = Cache.GetType().Assembly.GetType( "System.Web.Caching.CacheMultiple" );  Type cachekeyType = Cache.GetType().Assembly.GetType( "System.Web.Caching.CacheKey" );  FieldInfo cachesfield = cmt.GetField( "_caches", BindingFlags.NonPublic | BindingFlags.Instance );   object cacheInternal = cif.GetValue( this.Cache );  object caches = cachesfield.GetValue( cacheInternal );   Type arrayType = typeof( Array );  MethodInfo arrayGetter = arrayType.GetMethod( "GetValue", new Type[] { typeof( int ) } );  object cacheSingle = arrayGetter.Invoke( caches, new object[] { 1 } );   FieldInfo entriesField = cacheSingle.GetType().GetField( "_entries", BindingFlags.Instance | BindingFlags.NonPublic );  Hashtable entries = (Hashtable) entriesField.GetValue( cacheSingle );   List keys = new List();  foreach( object o in entries.Keys )  {   keys.Add( o );  }   MethodInfo remove = cacheInternal.GetType().GetMethod( "Remove", BindingFlags.NonPublic | BindingFlags.Instance, null,   new Type[] { cachekeyType, typeof( CacheItemRemovedReason ) }, null );  foreach( object key in keys )  {   remove.Invoke( cacheInternal, new object[] { key, CacheItemRemovedReason.Removed } );  } }

到此,关于"ASP.NET清空缓存的功能介绍"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

缓存 功能 代码 属性 方法 数据 学习 字段 更多 篇文章 类型 网站 问题 反射 帮助 实用 仅供参考 接下来 没想到 主干 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 海康服务器管理口系统 虹口区无线网络技术服务价格 vs2010数据库建立路径 虚拟机用什么网络安全 图传接收机软件开发 闵行区节能软件开发服务商是什么 服务器千兆带宽 自动提取网页数据库数据 通信管理局 网络安全监管 儿童网络安全文案 房地产企业软件开发流程 小程序开发前端和服务器架构图 服务器管理器下无任何选项 java 对象 数据库 双人模式无法连接服务器 大学数据库主码关系 不可替代的数据库运维 空间服务器不稳对网站有影响吗 贵州互联网养老软件开发电话 广东支付软件开发咨询 vps作为服务器安全性 速达财务软件需要数据库吗 枣庄 软件开发公司电话 命运2服务器连不了 vb小软件开发视频 公司服务器电脑开机一会自动关机 mc开了服务器一直在登入中 加密数字货币有服务器吗 许昌软件开发优化价格 软件开发工程师评估
0