我正在我的解决方案中实现输出缓存,并发现了覆盖此特定方案的问题。
搜索操作有一些参数,第一个是搜索文本,其余是过滤器,排序,偏移和限制。看起来有点像这样:
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
参数不为空,我希望请求始终转到代码。
是否可以通过输出缓存实现?
答案 0 :(得分:0)
首先,您需要包含的不仅仅是查询。事实上,所有这些都很重要。考虑OutputCache
实际缓存响应,而不仅仅是在操作中运行的查询,因此即使sort
需要不同的响应,或者它对返回的视图没有影响。但是,所有其他内容本身都与所做的查询相关联,因此这些不仅会影响视图,还会影响返回的实际数据。
长短,你应该真的只做VaryByParam="*"
并称之为一天。其他任何事都会导致问题。
如果您希望缓存查询本身,那么您可以使用MemoryCache
。但是,您需要在此处考虑除sort
之外的所有内容,否则实际数据将不正确。