阻止OutputCache缓存一个参数的更改,允许其他参数

时间:2016-06-16 15:51:56

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

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

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

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参数不为空,我希望请求始终转到代码。

是否可以通过输出缓存实现?

1 个答案:

答案 0 :(得分:0)

首先,您需要包含的不仅仅是查询。事实上,所有这些都很重要。考虑OutputCache实际缓存响应,而不仅仅是在操作中运行的查询,因此即使sort需要不同的响应,或者它对返回的视图没有影响。但是,所有其他内容本身都与所做的查询相关联,因此这些不仅会影响视图,还会影响返回的实际数据。

长短,你应该真的只做VaryByParam="*"并称之为一天。其他任何事都会导致问题。

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