【问题标题】:Prevent page from being cached when using OutputCacheAttribute使用 OutputCacheAttribute 时防止页面被缓存
【发布时间】:2011-05-07 13:06:08
【问题描述】:

有没有办法根据某些逻辑来防止页面被缓存?

我想缓存对页面的匿名访问,所以我可以设置 VaryByCustom="user" 并在 Global.asax 的 GetVaryByCustomString 方法中使用一些魔法。好的。但是,如果用户已通过身份验证,我实际上并不想缓存该页面,除非它未通过身份验证。有没有办法指定这种东西?

我希望数据不被添加到缓存中(而不是添加一些随机键)的原因是,随着缓存的增长,东西会被丢弃,我不希望未经身份验证的版本被扔出去。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-2 caching outputcache


    【解决方案1】:

    您可以在 asp.net 网络表单中的页面加载中以编程方式执行此操作。

    bool isAuthenticated = /*variable assignment*/;
    if (isAuthenticated){
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
    

    如果你想在某个单独的方法中使用这个逻辑,你可以像这样注册一个回调。

    Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(MethodWhichSetsCacheability), null);
    

    在 MVC 中,您应该能够在控制器中执行上述代码

    【讨论】:

      【解决方案2】:

      您可以在 GetVaryByCustomString 中检查用户是否经过身份验证。

      context.Request.IsAuthenticated
      

      如果为 true,则返回 null。如果不返回固定字符串。

      GetVaryByCustomString 的基本实现返回 null,所以这应该是安全的。但是由于 null 不能用作缓存中的键,所以我认为该页面不会被缓存。

      但是我没有测试过这个!

      【讨论】:

      • 是的,但问题是随着更多缓存键的添加,事物会被推出缓存。我绝对不希望未经身份验证的版本被推出缓存!
      • 啊好吧...在那种情况下...查看文档 GetVaryByCustomString 的基本实现返回 null。我想知道你是否这样做 - 页面没有被缓存......需要测试。这似乎很可能是因为缓存不能使用 null 作为键。
      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2013-05-18
      • 2011-11-04
      • 2014-07-20
      相关资源
      最近更新 更多