• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET清空缓存时遇到的问题简析

ASP.NET清空缓存时遇到的问题简析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了asp.net,asp net培训,asp和asp.net的区别,零基础学asp.net,c#和asp.net的区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

List<string> keys = new List<string>(); 
   // 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]); 
   } 
</div>

就可以了。

本以为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的值 
/// </summary> 
/// <param name="type"></param> 
/// <param name="propertyName"></param> 
/// <returns></returns> 
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); 
} 
 
/// <summary> 
/// 得到object对象的propertyName属性的值 
/// </summary> 
/// <param name="obj"></param> 
/// <param name="propertyName"></param> 
/// <returns></returns> 
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); 
} 
</div>

上面方法由于是通过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<object> keys = new List<object>(); 
 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 } ); 
 } 
}
</div>

以上就是对ASP.NET清空缓存时遇到问题详细分析,为了让大家更好地解决此类问题,希望本文对大家的学习有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • Asp.net core WebApi 使用Swagger生成帮助页实例

相关文章

  • 2017-05-11ASP.NET中 ObjectDataSource控件的DataObjectTypeName属性
  • 2017-05-11在应用程序级别之外使用注册为allowDefinition='MachineToApplication'的节是错误的
  • 2017-05-11asp.net多选项卡页面的创建及使用方法
  • 2017-05-11ASP.NET中repeater控件用法实例
  • 2017-05-11如何将数据绑到gridview然后导成excel
  • 2017-05-11ASP.NET中ListView(列表视图)的使用前台绑定附源码
  • 2017-05-11真正的获取客户端真实IP地址及利弊分析
  • 2017-05-11asp.net实现Gradview绑定数据库数据并导出Excel的方法
  • 2017-05-11.NET读取Excel文件的三种方法的区别
  • 2018-08-20asp.net mvc webapi 实用的接口加密方法示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET 链接 Access 数据库路径问题最终解决方案
    • System.Web.Routing入门及进阶
    • 基于.NET BitmapImage 内存释放问题的解决方法详解
    • 把ASP.NET MVC项目部署到本地IIS上的完整步骤
    • ASP.NET 使用application与session对象写的简单聊天室程序
    • 一步一步asp.net ajax类别Tree生成
    • ASP.NET MVC如何使用Unity实现Ioc详解
    • asp.net母版页如何使用
    • Json数据转换list对象实现思路及代码
    • 得到真实外网IP、IP所在国家、省份、地区(小偷程序)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有