【问题标题】:MVC Cache Based on Variables in Session and Custom Security Logic基于会话变量和自定义安全逻辑的MVC缓存
【发布时间】:2012-06-30 01:50:27
【问题描述】:

我有一个使用 JQuery 显示许多图表和表格的应用程序。其中一些图表基于会话中保存的变量(例如,用户在另一个页面中添加了一个值,而在下一页我正在生成一个图表,因此用户请求不发送任何参数)

我在网上四处寻找,大多数解决方案都是基于

 [OutputCache(Duration=60, VaryByParam="someParm")]

问题是我的大部分请求不发送参数,它们只是使用会话中的值。

有没有办法为这些类型的请求启用缓存?

编辑:我们有一个复杂的安全要求,我们不能使用 MVC 的默认授权属性。我们必须根据当前用户 + 发送给动作的参数来编写逻辑,因此动作内部的方法决定要么继续请求,要么不返回任何内容。这使得缓存非常困难,因为在执行 OutputCache 时我们只有参数,但上下文中的标识对象是空的。结果,如果一个具有管理员权限的用户发送一个请求 a 和 b,然后一个具有最低权限的用户发送请求 a 和 b,第二个人将看到结果,因为操作没有运行,但是值来自缓存被使用了!

为了解决这个问题,我使用了 getvarybyCustome。这个函数所做的只是返回用户的组名,这有助于创建一个更复杂的密钥。上一个示例中具有最低权限的人将拥有与管理员的请求缓存键 (a,b,group_admin) 不同的缓存键 (a,b,group_less)。但是,为每个请求获取组名也很昂贵,因此我使用 Cache 对象来缓存用户组,因此在会话开始时,会从 AD 查询用户组并保存到缓存中,因此对于他/她以后的请求,他的组名是从缓存中检索的。

【问题讨论】:

    标签: asp.net-mvc model-view-controller caching


    【解决方案1】:

    如果您无法通过VaryByParam 实现,那么您可以尝试VaryByCustom。查看示例here

    【讨论】:

    • 问题是当调用GetVaryByCustomString时会话对象为空:(
    【解决方案2】:

    您可以对此请求进行重定向并将其发送到发送会话参数的新控制器方法,通过这种方式,在未来的实现中,您可能会使用查询字符串参数而不是会话,并且您的代码也可以工作。

    您可以在所有控制器的基类上创建一个转换此会话参数的方法,只需编写一次转换。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2011-10-09
      相关资源
      最近更新 更多