【问题标题】:Prevent OutputCache from caching for changes in one parameter, allow for others防止 OutputCache 缓存一个参数的更改,允许其他参数
【发布时间】:2016-06-16 15:51:55
【问题描述】:

我正在我的解决方案中实现输出缓存,并发现了涵盖此特定场景的问题。

有一个搜索动作有几个参数,第一个是搜索的文本,其余的是过滤器、排序、偏移和限制。它看起来有点像这样:

public async Task<ActionResult> Search(
    string query = "",
    ushort limit = 12,
    int offset = 0,
    int filter1 = 0,
    int filter2 = 0,           
    SortObject sort = null)
{
}

问题是,最常使用没有查询的过滤搜索,我想缓存那种结果。但是,如果有人使用文本查询,它很可能每次都是唯一的,所以我认为缓存这些并浪费内存空间没有意义。

我使用了以下OutputCacheAttribute 来实现这一点:

[OutputCache(Duration = 3600, VaryByParam = "filter1;filter2;limit;offset;sort")]

但是(正如预期的那样)它不起作用,因为它完全忽略了query 参数并缓存其他参数的每个更改。

我想要实现的是缓存 query 参数为空的结果,而其他参数正在更改。但是,如果query参数不为空,我希望请求去总是去代码。

输出缓存可以实现吗?

【问题讨论】:

  • 你试过用VaryByCustom代替吗?
  • 我已经阅读过它,但是(基于示例)它似乎更像是一种基于自定义字符串(或浏览器类型和版本)创建更多缓存版本的机制。我需要的是防止将结果存储在!string.IsNullOrEmpty(query) 的缓存中,这可以通过VaryByCustom 实现吗?

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


【解决方案1】:

首先,您需要包含的不仅仅是查询。事实上,所有这些都很重要。考虑到OutputCache 实际上缓存了响应,而不仅仅是在操作中运行的查询,所以即使sort 也需要不同的响应,否则对返回的视图没有影响。然而,所有其他的,本质上都与所进行的查询相关联,因此这些影响不仅会影响视图,还会影响返回的实际数据。

不管长短,你真的应该只做VaryByParam="*" 并收工。其他任何事情都会导致问题。

如果您希望缓存查询本身,那么您可以使用MemoryCache。但是,您需要再次考虑除sort 之外的所有内容,否则实际数据将不正确。

【讨论】:

  • 是的,我意识到了,也许我只是措辞错误。 VaryByParam="*" 将导致 OutputCache 分别存储每个文本查询的响应,这感觉有点像内存空间浪费,我正在努力避免这种情况。
  • 好吧,你不能同时拥有它。您必须更改查询,否则您将发送生成缓存的任何查询的结果,而不是用户正在执行的当前查询。要么缓存每个查询,要么不缓存。
  • 对于它的价值,输出缓存实际上从未用于搜索页面之类的东西。几乎每个请求都会以某种方式有所不同,因此缓存任何内容几乎没有意义。使用完全相同的查询、过滤器、排序顺序等发出两个请求的可能性非常小。
  • 通常是这样,在我的场景中,文本搜索总是如此。但是,在我们的应用程序中,有一些“预定义搜索”,它们始终是一组具有默认限制和偏移量的过滤器,并且很可能是用户最常用的东西。这就是我想缓存这些内容的原因,但如果是文本搜索,请始终转到代码。
  • 那么,我建议删除OutputCache,只使用内存缓存您明确关心的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2023-03-30
相关资源
最近更新 更多