Asp.net mvc 基于会话变量和自定义安全逻辑的MVC缓存

Asp.net mvc 基于会话变量和自定义安全逻辑的MVC缓存,asp.net-mvc,model-view-controller,caching,Asp.net Mvc,Model View Controller,Caching,我有一个应用程序,它使用JQuery显示许多图表和表格。其中一些图表基于会话中保存的变量(例如,用户在另一个页面中添加了值,而在下一个页面中我正在生成图表,因此用户请求不发送任何参数) [OutputCache(Duration=60, VaryByParam="someParm")] 我在网上四处寻找,大多数解决方案都是基于 [OutputCache(Duration=60, VaryByParam="someParm")] 问题是我的大多数请求不发送参数,它们只使用会话中的值 [O

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

 [OutputCache(Duration=60, VaryByParam="someParm")]
我在网上四处寻找,大多数解决方案都是基于

 [OutputCache(Duration=60, VaryByParam="someParm")]
问题是我的大多数请求不发送参数,它们只使用会话中的值

 [OutputCache(Duration=60, VaryByParam="someParm")]
有没有办法为这类请求启用缓存

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

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

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

如果您无法通过
VaryByParam
实现某些功能,则可以尝试
VaryByCustom
。参见示例

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

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

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

问题是当调用GetVaryByCustomString时,会话对象为null:(
 [OutputCache(Duration=60, VaryByParam="someParm")]