首页 新闻 会员 周边 捐助

片段缓存更新的问题

0
悬赏园豆:50 [已解决问题] 解决于 2010-03-08 10:08

.ascx 控件中写入了缓存.用代码如何直接更新?

在这位仁兄提到用缓存依赖,但是这样在每个使用该控件的页面都得写入依赖信息。有没有像更新aspx页面的方法:

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

直接更新。

clound的主页 clound | 菜鸟二级 | 园豆:481
提问于:2010-03-06 10:19
< >
分享
最佳答案
0

用户控件级缓存和页面级缓存类似,不同的是可以只缓存页面局部的用户控件,对于不需要整页缓存的页面来说是种不错的解决方案。可是清空页面缓存的 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() 中判断多个关键字,以控制不同的用户控件输出缓存。

收获园豆:40
查尔斯 | 老鸟四级 |园豆:3832 | 2010-03-06 11:35
其他回答(1)
0

如果用户控件中不使用OutputCache这样子的方式来进行缓存的话,个人觉得倒是可以这样子,比如现在我们在用户控件中使用System.Web.Cache.Caching.Cache,现在假如有Cache.Insert("UKey",list),那么要实现你上面的需求,个人觉得可以在用户控件中写public void UCache(int v)这样一个缓存方法,缓存时间为100秒,现在用户控件中的数据可以直接UCache(0)来输出缓存的数据,现在如果aspx页面需要更新某个用户控件中的缓存,现在就可以使用调用用户控件UCache(1)来重新来更新这个缓存,这样来刷新缓存内容。这样子就是变相的来刷新用户控件的缓存了。UCache方法带一个开关参数,传入不同的值进行取缓存或者更新缓存...

收获园豆:10
西越泽 | 园豆:10775 (专家六级) | 2010-03-06 16:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册