2012-07-25 33 views
5

是否可以根据会话中的某些值改变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,它应该每次都服务于相同的'标准'页面。

可以通过这种方式改变缓存吗?

回答

0

你应该看看“甜甜圈缓存”,但这不是ASP.NET MVC 3支持的,至少不是开箱即用的。幸运的是有人已经解决了这个问题,你看MvcDonutCaching

我读到,ASP.NET MVC 4将包括“甜甜圈孔缓存”开箱,但我不能告诉如果它在当前的RC或不。

2

如果您想个性化每个用户的缓存输出,最好将位置设置为OutputCacheLocation.Client,如下所示。更多信息here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    }