asax用户控件上做的页面级缓存,如果手动移除呢。我试着考虑过做个缓存依赖,但是发现似乎只能依赖文件,不能依赖KEY有没有什么方法,一调用直接移除掉。。

解决方案 »

  1.   

    “一调用直接移除掉”什么意思呢?举个依赖数据Cache的值的例子。假设网站中有一个class名字叫做“网站高兴指数”,这个类型有一个属性“Value”是int类型的。假设你的用户控件依赖于整个网站的高兴指数(以abc为key被保存在网站Cache中),只有当它改变时才使得缓存刷新,那么你的用户控件可以声明缓存依赖方式:<%@ OutputCache Duration="60000" VaryByParam="*" VaryByCustom="cache:abc" %>然后,在你的global.asax中写:
        public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom == "cache:abc")
            {
                HttpContext h = HttpContext.Current;
                object x = h.Cache["abc"] as 网站高兴指数;
                if (x == null)
                    return string.Empty;
                else
                    return x.Value;
            } 
            ..................
        }
    这就可以依赖于自己的全局缓存数据了。你还可以在这个自定义依赖程序中去查找数据库值(通过额外做一个轻量而快速的数据库查找来避免后续生成用户控件而进行的一大堆数据库查找和控件解析动作是很值得的),或者检查服务器运行状况(不过根据这个来控制缓存刷新有点奇怪,这是我随便想出来的),等等。VaryByParam、VaryByControl等属性设置,与VaryByCustom是同时起作用的,是“AND”关系,你可以都使用上。其最根本的,是VaryByCumsom,你可以通过自己写程序来完成别的属性所标记的所有功能。
      

  2.   

    哦,随手写的:   return x.Value;似乎应该写为   return x.Value.ToString();
      

  3.   

    嘿!还有一个object应该写为强类型的。    public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom == "cache:abc")
            {
                网站高兴指数 x = context.Cache["abc"] as 网站高兴指数;
                if (x == null)
                    return string.Empty;
                else
                    return x.Value.ToString();
            }         return base.GetVaryByCustomString(context, custom);
        }语法问题自己改一下吧,意思理解了就好。