根据每个用户刷新缓存

时间:2014-06-06 17:53:22

标签: caching asp.net-web-api

我正在使用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)吠叫错误的树。

0 个答案:

没有答案