基于会话值的MVC OutputCache
问题描述:
是否可以根据会话中的某些值改变MVC中的输出缓存?我已经阅读了很多关于在Global.asax中使用varybycustom功能和重写GetVaryByCustomString的知识,但会话在此时不可用。基于会话值的MVC OutputCache
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "somekey")
//Want to check the session here (but it isn't available).
return base.GetVaryByCustomString(context, custom);
}
我明白这是因为直到稍后请求管道中才创建会话。
我的问题是,如果不根据用户的会话改变缓存,页面(根据用户在会话中有什么变化,具有特定于该用户的附加HTML等)将被缓存(因为URL是同样),并由我们的负载均衡器,代理服务器等提供服务,然后用其他人的会话信息在页面上提供其他请求!
该URL相同的原因是用户作为'客人'进来,输入一些信息(POST),这是验证和存储在会话中,然后他们被重新定向回到同一页面(现在应该基于会话数据专用于用户)。
页面本身应该正常缓存,因为如果'访客'访问相同的URL,它应该每次都服务于相同的'标准'页面。
可以通过这种方式改变缓存吗?
答
你应该看看“甜甜圈缓存”,但这不是ASP.NET MVC 3支持的,至少不是开箱即用的。幸运的是有人已经解决了这个问题,你看MvcDonutCaching
我读到,ASP.NET MVC 4将包括“甜甜圈孔缓存”开箱,但我不能告诉如果它在当前的RC或不。
答
如果您想个性化每个用户的缓存输出,最好将位置设置为OutputCacheLocation.Client
,如下所示。更多信息here
[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
public string GetName()
{
return "Hi " + User.Identity.Name;
}