3

我正在使用属性[OutputCache(Duration=XXX)](以及甜甜圈变体[DonutOutputCache(Duration=XXX)])。

但是我注意到(由ASP.NET (MVC) Outputcache 和并发请求确认)这不是线程安全的:当重新生成缓存时,如果控制器方法足够慢(通常是这种情况,这就是你缓存的原因它^^),多个“相同”的请求可以输入操作并执行操作,而不是只处理一个请求,阻止其他请求并从缓存中提供它们。

有什么方法可以轻松创建阻塞/线程安全OutputCache属性?同样的问题DonutOutputCache?喜欢[BlockingOutputCache(SameParameters)][BlockingDonutOutputCache(SameParameters)]

注意:缓存的动作是常规动作,返回View(model),在动作和视图中完成繁重的工作(视图可以做一些非常简单的事情,例如 @Model.GetPrice() ,它转化为后端的繁重工作)。

谢谢!

编辑:另一种方法可能是创建一个[BlockingAction(BlockingParameters)]属性,当没有从缓存中提供服务时,该属性将阻止对该操作的后续请求。

4

1 回答 1

1

您可以使用 VaryByCustom。在 Global.asax 中覆盖 GetVaryByCustomString 方法。然后创建唯一的缓存键,并在缓存存储上使用双重检查锁定。是同步方式。我可能猜想当您开始缓存解析然后结束缓存解析时存在异步方式。

于 2013-10-18T15:16:26.950 回答