1

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

我在网上环顾四周,大多数解决方案都基于

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

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

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

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

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

4

2 回答 2

1

如果你不能实现的东西,VaryByParam那么你可以尝试VaryByCustom在此处查看示例

于 2012-06-28T14:09:54.557 回答
1

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

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

于 2012-06-28T14:14:45.507 回答