ASP.Net MVC过期输出缓存

16

我正在我的MVC应用程序中使用标准的输出缓存标记,这很好用,但我需要在某些时候强制它被清除。我该怎么做?被缓存的页面是从非常简单的路由{Controller}/{PageName}构建的 - 因此大多数页面都是这样的:/Pages/About-Us

以下是我放置在.aspx视图页顶部的输出缓存标记(只是为了清楚起见):

<@ OutputCache Duration="100" VaryByParam="None" %>

所以在同一个控制器上执行另一个操作来更新内容时,我需要清除这个缓存,或者甚至清除所有缓存 - 这是一个非常小的应用程序,所以清空所有缓存项不是什么大问题。

4个回答

16

注意使用 "None" 与 ""。

  • 如果你发送 "",则 Vary 的 HttpHeader 不会 发送。
  • 如果你发送 "None",则 Vary 的 HttpHeader 发送。

我使用Fiddler验证了这种行为。

这似乎会影响浏览器是否返回服务器以检查最新版本(导致304)。至少在Chrome中是这样的。如果您确定在文件过期之前不想更新文件,则应该使用 Varies=""

建议像我在 这篇文章 中所做的那样使用 Varies=""。对于我的JavaScript文件,我不希望浏览器在文件过期之前再次发起Http请求。304是不必要的。


是啊,这是怎么回事?如果你将VaryByParam设置为“none”,为什么它会发送“Vary:*”? - bzlm
1
确认一下,当你使用 Varies="none" 时,响应头中会包含 Vary: *。而当你使用 Varies="" 时,则不会有这样的响应头。 - Jeff Atwood
8
或者,要移除 Vary: *,请使用 this.Response.Cache.SetOmitVaryStar(true);。 - Kevin Hakanson
1
@KevinHakanson:或者,在您的 web.config 中为整个应用程序设置它:<caching><outputCache omitVaryStar="true" /></caching> - TheCloudlessSky
3
这是有用的信息,但似乎没有回答提出的问题,至少没有上下文。@Slee,你是否将此答案与其他答案的信息相结合?如果是这样,我们应该编辑此答案以包含必要的更基础信息。如何释放输出缓存?而“小心使用None vs”“”与这个问题有什么关系呢? - Seth
显示剩余3条评论

15

HttpResponse.RemoveOutputCacheItem()可能是您想要使用的方法。如果您可以弄清楚缓存操作的名称,您可以仅删除特定操作(尝试设置断点或将所有缓存项的名称转储到屏幕上)

否则,我会遍历整个输出缓存并清除每个项目。


7

我不知道在VaryByParam中使用“None”和“”之间的区别,我一直使用这个属性:

[OutputCache(Location=OutputCacheLocation.ServerAndClient, Duration=int.MaxValue, VaryByParam="none")]

以下是“修复”Vary:*问题的代码:

this.Response.Cache.SetOmitVaryStar(true);

我在ASP.NET缓存测试中发现了一个与VaryByParam有关的错误

将OutputCache指令设置为“Client”和“ServerAndClient”的区别在于,“ServerAndClient”会输出Vary字段。这会影响IE,因为IE会发送请求。使用vary:*标头可以禁用所有客户端缓存(http://msdn2.microsoft.com/en-us/library/system.web.httpcachepolicy.setomitvarystar.aspx)。

唯一删除vary:*标头从而允许客户端缓存的方法是通过代码实现:


1

看起来输出缓存没有将任何东西放入 HttpContent.Cache 中,因为当我循环遍历时,集合为空:

For Each elem As DictionaryEntry In HttpContext.Cache
  HttpContext.Cache.Remove(elem.Key)
Next

这是我的动作属性:

<OutputCache(Duration:=600, VaryByParam:="pagename")> _
Function Index(ByVal pagename As String) As ActionResult

5
HttpContext.Cache和OutputCache不是一个东西吗?我可能错了,但是你的示例是在处理HttpContext.Cache。 - Zachary Yates
@Zach 是的,它们没有真正的关系。 - bzlm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接