【问题标题】:can you use output caching in asp.net-mvc based on the parameters of your controller action您可以根据控制器操作的参数在 asp.net-mvc 中使用输出缓存吗
【发布时间】:2011-09-14 09:58:02
【问题描述】:

我想使用输出缓存来避免使用相同的静态查询一遍又一遍地访问我的数据库,但我的控制器具有唯一定义帖子的参数。

我怎样才能在考虑参数的同时仍然支持 asp.net-mvc 中的输出缓存?

【问题讨论】:

  • 多个参数如何变化?

标签: c# asp.net-mvc caching outputcache


【解决方案1】:

查看 OutputCache 属性的 VaryByParam 属性。

[OutputCache(Duration=int.MaxValue, VaryByParam="id")]
public ActionResult Details(int id)
{
}

对于每个唯一的 id 值,将创建一个唯一的缓存实例。

编辑:

如果您的缓存需求超出了简单的 VaryByParam 场景,请查看 VaryByCustom。这将允许您设置您认为合适的场景(登录与未登录用户的缓存版本等)

【讨论】:

  • 如果我的参数是具有多个属性的对象,这是否有效??
  • 您可以,但您应该注意一些副作用。例如,请参阅此帖子:stackoverflow.com/questions/5144592/… 因此,您可以传递一个对象并执行 VaryByParam="*" 例如,但最终建议(或者我的意见,我应该说)是具有一些独特的原始值或一组您可以使用的原语。
  • 感谢您的链接。为了澄清,在示例链接中,只要 Id 匹配,部分页面是否会被缓存。如果它们的 id 匹配但 content 的属性发生了变化怎么办?那仍然会产生缓存的结果。如果是这样,那不是我想要的。我希望缓存是与每个唯一对象的 1:1 映射。我想我可以将对象上的 Override the ToString() 用作考虑字符串所有属性的唯一字符串。这应该有效,对吗?
  • 如果 Id 匹配,将检索缓存版本的内容。一旦缓存项目的持续时间到期,将检索较新的内容。在您的场景中,听起来您想要一个单独的缓存副本来对对象进行任何更改,无论多么小?如果是这样,只需执行 VaryByParam="*" 并且由于您有一个执行 ToString() 转换的对象参数,您应该(您必须对其进行测试,我从未亲自使用过对象和输出缓存这种方式)为每个更改获取一个单独的缓存,就像你想要的那样。
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2020-09-02
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多