如何使用OutputCache和VaryByCustom页面来考虑ASP.NET 2.0+中的多个条件?

时间:2011-05-24 13:46:59

标签: asp.net caching global-asax

我们有一个多语言的网站,并且在用户登录后有一些个性化(例如标题显示不同的链接,用户的用户名等),但我们想要缓存特定的公共对象页面,这些页面是用户登录前的页面(例如,仅供浏览网站的用户)。

在ASP.NET 2.0站点中使用VaryByCustom时是否有办法考虑以下多个条件(是的,我们最终会升级,但现在不升级)以及如何将页面挂钩以将多个条件传递到方法?

  1. 自定义ASP.NET成员资格配置文件 财产叫 Profile.Preferences.Language(我们 将检查URL方案并设置 语言属性为有效 VaryByCustom之前的值)。
  2. 用户的浏览器
  3. 任何querystrings / params
  4. 这三种情况将允许我们缓存我们频繁访问的公共页面,并且不必计算内容/命中数据库或其他缓存以获取不经常更改的页面的菜单项等的来源。

    非常感谢任何帮助。

    谢谢,

2 个答案:

答案 0 :(得分:0)

对于数字2和3,您可以使用以下

<%@ OutputCache Duration="Whatever you want in seconds" VaryByParam="*" VaryByCustom="browser"%>

对不起,我无法帮你解决第一个问题

答案 1 :(得分:0)

我建议覆盖Global.asax中的GetVaryByCustomString方法,根据上述三个标准创建自己的缓存密钥。

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    const string KEY = "UserSpecific";
    if (arg == KEY) {
         //perform some logic to generate a unique key per querystring, brower and profile
         string cacheKey = context.Request.QueryString["someparam"] + ...
         return cacheKey;
     }

    return base.GetVaryByCustomString(context, arg);
}

修改outputcache指令以利用这个新的cachekey生成逻辑。

<%@ OutputCache Duration="300" VaryByParam="none" VaryByCustom="UserSpecific" %>