我正在使用https://github.com/filipw/AspNetWebApi-OutputCache为我的web-api项目添加简单的缓存,我的操作看起来像这样:
[HttpGet]
[CacheOutput(ClientTimeSpan = 86400, ServerTimeSpan = 86400)]
public List<Things> GetThings()
{
return service.GetThings();
}
现在的东西是一个适用于每个人的 thing 列表的组合,以及由用户创建的用户定义的 thing 并且只对该用户可访问。所以我希望这里的缓存与特定用户绑定。我不希望用户Bob
获取包含特定于Sally
的内容的列表。所以我创建了自己的密钥生成器,继承自DefaultCacheKeyGenerator
,将附加用户ID:
public override string MakeCacheKey(System.Web.Http.Controllers.HttpActionContext context, System.Net.Http.Headers.MediaTypeHeaderValue mediaType, bool excludeQueryString = false)
{
var key = base.MakeCacheKey(context, mediaType, excludeQueryString);
return string.Format("{0}:{1}", key, userService.CurrentUser.UserID);
}
这里的UserID
最终是从用户授权cookie中提取的。
这似乎工作正常。
但是,我有另一个操作可以让用户保存他们的自定义的东西,显然当我在这里POST时我想使缓存无效,所以它看起来像这样:
[HttpPost]
[InvalidateCacheOutput("GetThings")]
public void SaveUserThing(UserThingModel thing)
{
service.Save(thing);
}
这里的问题(或者说效率低下)是我的理解,这将刷新此控件下的所有内容和GetThings
(所有缓存的基本密钥),其中包括缓存对于每个用户。这意味着如果Bob
保存了新内容,我将强制Sally
必须获取全新的内容列表,即使她的列表不会更改。
有一个简单的方法吗?我怀疑问题出在CacheOutputConfiguration.MakeBaseCacheKey,但似乎没有一种机制可以覆盖该功能,使其从控制器,动作和 userId构建基本密钥。
我可能只是从GitHub抓取来源并根据我的需要进行调整,但我想确定我不是a)遗漏了一些明显的东西,并且b)吠叫错误的树。