您有相当大的内存密集型仪表板,每个用户都有所不同。如何根据当前登录的userID缓存响应,该userID不作为参数传递,但需要从当前登录的用户派生。我的理解是VaryByParam查看请求上下文
数据库中还有一个值,当更改时需要重置缓存
答案 0 :(得分:27)
在Web.config
:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Dashboard" duration="86400" varyByParam="*" varyByCustom="User" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
在Controller
/ Action
:
[OutputCache(CacheProfile="Dashboard")]
public class DashboardController : Controller { ...}
然后在Global.asax
:
//string arg filled with the value of "varyByCustom" in your web.config
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "User")
{
// depends on your authentication mechanism
return "User=" + context.User.Identity.Name;
//?return "User=" + context.Session.SessionID;
}
return base.GetVaryByCustomString(context, arg);
}
本质上,GetVaryByCustomString
将允许您编写一个自定义方法,通过返回一个将用作某种类型的字符串来确定是否存在Cache hit
/ miss
。每个缓存副本'hash'。
答案 1 :(得分:3)
稍微修改一下代码,并在发布时在表单中添加一个包含userId哈希值的隐藏字段。
或者更好的方法是使用VaryByCustom方法,并根据用户cookie值而变化。
这是一个很好的参考:
http://codebetter.com/darrellnorton/2004/05/04/asp-net-varybycustom-page-output-caching/