6

是否可以根据会话中的某些值来改变 MVC 中的输出缓存?我已经阅读了很多关于在 Global.asax 中使用 varybycustom 功能和覆盖 GetVaryByCustomString 的内容,但此时会话不可用。

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);
}

我知道这是因为 Session 直到稍后在请求管道中才创建。

我担心的是,在不根据用户会话更改缓存的情况下,页面(根据用户在会话中的内容而更改,具有特定于该用户的其他 HTML 等)将被缓存(因为 URL 是相同的)和由我们的负载均衡器、代理服务器等提供服务,然后在页面上使用其他人的会话信息服务于其他请求!

URL 相同的原因是用户作为“访客”进入,输入一些信息(POST),经过验证并存储在会话中,然后他们被重定向回同一页面(现在应该根据会话数据特定于用户)。

页面本身应该被正常缓存,因为如果“访客”访问相同的 URL,它应该每次都提供相同的“标准”页面。

是否可以以这种方式改变缓存?

4

3 回答 3

3

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

   [OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
   public string GetName()
   {
         return "Hi " + User.Identity.Name;
   }
于 2013-09-09T10:07:04.723 回答
0

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

我读到 ASP.NET MVC 4 将包括开箱即用的“甜甜圈孔缓存”,但我不知道它是否在当前的 RC 中。

于 2012-07-25T09:12:48.063 回答
0

输出缓存 ActionFilter会有帮助吗?

或者,也许您可​​以将视图重构为布局页面以及匿名和经过身份验证部分的部分视图,然后使用Partial Caching

于 2012-07-25T08:40:44.277 回答