问题描述
|
我们有一个多语言的网站,并且在用户登录后具有某些个性化设置(例如,标题显示不同的链接,用户的用户名等),但是我们希望缓存特定的面向公众的页面,用户登录之前页面的版本(例如,对于仅浏览该网站的人)。
在ASP.NET 2.0站点中使用VaryByCustom时,是否有一种方法可以考虑以下多个条件(是的,我们最终会升级,但不是现在),您将如何挂接页面以将多个条件传递给方法?
自定义ASP.NET成员资格配置文件
属性称为
Profile.Preferences.Language(我们
将检查URL方案并设置
语言属性设置为有效
VaryByCustom之前的值)。
用户的浏览器
任何查询字符串/参数
这三种情况将使我们能够缓存我们经常访问的公共页面,而不必计算事物/命中数据库或其他缓存来获取不经常更改的页面的菜单项等。
任何帮助将不胜感激。
谢谢,
解决方法
对于数字2和3,您可以使用以下代码
<%@ OutputCache Duration=\"Whatever you want in seconds\" VaryByParam=\"*\" VaryByCustom=\"browser\"%>
对不起,我不能帮你第一个
,我建议重写Global.asax中的GetVaryByCustomString方法,以根据上述三个条件创建自己的cachekey。
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\" %>