【问题标题】:MVC OutputCache based on Session values基于 Session 值的 MVC OutputCache
【发布时间】:2012-07-23 15:24:04
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net asp.net-mvc outputcache


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      Output Cache ActionFilter 有帮助吗?

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-03-01
          • 2013-09-01
          • 1970-01-01
          • 2018-02-01
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-14
          相关资源
          最近更新 更多