2012-06-28 32 views
1

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

I是在网络上环顾四周,大部分的解决方案都是基于

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

问题是最我的要求不发的参数,他们只是使用在会话中的值。

有什么办法可以为这些类型的请求启用缓存吗?

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

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

回答

1

如果你不能通过VaryByParam达到目的,那么你可以尝试VaryByCustom。看一个例子here

+0

问题是GetVaryByCustomString被调用会话对象为空:( – Reza

1

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

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