- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ASP.NET清空缓存时遇到的问题简析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在网站中要做一个清理缓存的功能(也就是在缓存为到期之前就强制缓存过期),程序中有的地方使用的HttpRuntime.Cache来做的缓存,而和数据库交互部分则使用ObjectDataSource提供的缓存机制。清理HttpRuntime.Cache的缓存很简单,只要 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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]);
}
|
就可以了.
本以为ObjectDataSource等数据源的缓存也是保存在HttpRuntime.Cache中,经过测试没想到竟然不是,因为执行上面的代码以后ObjectDataSource仍然是从缓存读取数据.
使用Reflector反编译发现ObjectDataSource是使用HttpRuntime.CacheInternal来实现的缓存。CacheInternal是internal的,因此没法直接写代码调用,同时CacheInternal中也没提供清空缓存的方法,只能通过实验发现_caches._entries是保存缓存的Hashtable,因此就用反射的方法调用CacheInternal,然后拿到_caches._entries,最后clear才算ok.
最终代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
//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);
}
|
上面方法由于是通过crack的方法进行调用,可能有潜在的问题,因此仅供参考.
在google上搜索到另外一篇文章,主干是代码,代码的思路和我一样,贴过来也供参考.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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 } );
}
}
|
以上就是对ASP.NET清空缓存时遇到问题详细分析,为了让大家更好地解决此类问题,希望本文对大家的学习有所帮助.
最后此篇关于ASP.NET清空缓存时遇到的问题简析的文章就讲到这里了,如果你想了解更多关于ASP.NET清空缓存时遇到的问题简析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 QVariantList。我怎样才能清空它。 我试过了 myList.clear() 和 myList.empty(); 但运气不好。有什么想法吗? 最佳答案 A QVariantList只
我在创建一个空的 JTabbedPane 时遇到问题,其中在 GUI 上唯一可见的部分是选项卡行。 每次我添加一个带有“空”组件的新选项卡时,JTabbedPane 的高度都会增加,但这是为什么呢?
我有一个简单的 Windows 窗体,其中包含一个名为 list 的 ListView 对象。在窗体上,一个按钮使我能够在单击 list.Items.Clear() 时清空列表。这很好用。 现在我有一
最近遇到一点麻烦事,新安装的PHPwind6.0正式版社区在导入之前的会员帐号资料时,发现很多会员的mail地址貌似胡乱填写的,之前的PHPwind5.5版本没有开启mail地址验证功能,所以估计很
我在 Visual Basic for Applications 中遇到一个 Collection 对象问题(我在 Excel 中使用它) 我有这段代码试图清空一个我必须重新使用的 Collectio
我想清空 CKEditor 中的文本区域。 我可以使用 SetData(' ') 清除 TextArea,但只能在页面加载后清除一次。 我只在 Onchange 事件中编写了 jquery 函数。
使用 iOS6 的很棒的新 UICollectionView 我如何能够删除一个大循环中的所有 UICollectionViewCell 对象? 假设我已经将所有数据加载到其中,我点击刷新,我想删除那
有没有办法在不诉诸目标的情况下删除 ItemGroup 的内容?我正在寻找相当于: 谢谢 最佳答案 不可以,正如文档所述,Remove 只能包含在 Target 内的 ItemGroup 中
我想清除数组对象中的所有元素(可以是标准的 PHP 数组、ArrayObject 或基本上实现基本数组接口(interface)的任何其他对象,如 Itertable、ArrayAccess、Coun
我有一个 9x9 的网格布局,并生成 Jtextareas 来填充它。如果用户按下按钮,我希望网格布局再次变空,以便我可以再次填充它,但与之前填充的内容无关。是否有某种命令,例如 gridlayout
使用 iOS6 的很棒的新 UICollectionView 我如何能够删除一个大循环中的所有 UICollectionViewCell 对象? 假设我已经将所有数据加载到其中,我点击刷新,我想删除那
我正在尝试在 Eclipse 中使用 Nutch 运行爬网。 我正在使用一个名为 urls 的文件,它包含 http://www.google.com/ 但是,当我运行该项目时,Generator 类
$(document).ready(function () { $('#btnSearch').bind('click', function () {
我有一个 jquery 函数,它在单击事件时清空一个 div,获取一些 json,然后附加到已清除的 div。但是,我试图附加到所述 div 的复选框没有出现。这是我的代码: $(function()
我见过类似的问题,但没有一个和我的完全一样,而且我无法理解答案,所以我希望你能帮助我。 thread我指的是以某种方式解决了异步任务或其他问题,但我不确定那是什么。我的问题是我的布局有一个 TextV
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
一些事实: - 我的应用程序是客户端。 - 我有一个Socket 池。 - 多个 Thread 使用此池。 - 每个线程都可以超时。 - 超时时,Socket 返回到池中,即使没有从服务器读取回复。
请考虑以下代码,包括两个线程 buffering_thread(用一条消息填充缓冲区指针)和 sending_thread(清空缓冲区): #include "msg.cpp" msg * buffe
我制作了这个板,以随机顺序附加了一些框。 当单击按钮时,我想以新的随机顺序附加框,但显然不起作用(.board 保持为空) http://jsbin.com/pedanobawe/2/edit?htm
我有一个脚本,它将文件列表存储在一个数组中,如下所示 set -A my_array $(ls -tr $INPUT_DIRECTORY/*) 我必须清空这个 my_array 变量才能将其用于其他目
我是一名优秀的程序员,十分优秀!