使输出缓存过期ASP.Net MVC

时间:2008-12-18 03:40:30

标签: asp.net asp.net-mvc caching outputcache

我在我的MVC应用程序中使用标准的outputcache标签,效果很好,但我需要强制它在某些时候被转储。我该如何实现这一目标?缓存的页面是从一个非常简单的路径构建的{Controller} / {PageName} - 因此大多数页面都是这样的:/ Pages / About-Us

这是我的.aspx视图页面顶部的输出缓存标记,只是为了清楚:

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

因此,在内容更新的同一控制器上的另一个操作中,我需要转储此缓存,甚至是所有缓存 - 这是一个非常小的应用程序,因此转储所有缓存项目并不是一件大事。

4 个答案:

答案 0 :(得分:16)

小心使用“无”与“”。

  • 如果您发送“”,则Vary的HttpHeader 已发送。
  • 如果您发送“无”,则Vary 的HttpHeader将发送。

我使用Fiddler来验证此行为。

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

我建议像this post中那样使用Varies=""。对于我的javascript文件,我不希望浏览器返回并发出另一个Http请求,直到它过期。 304是不必要的。

答案 1 :(得分:14)

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

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

答案 2 :(得分:6)

不知道VaryByParam的“无”和“”之间的区别,我使用的是这个属性:

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

此代码用于“修复”Vary: *问题:

this.Response.Cache.SetOmitVaryStar(true);

我在ASP.NET caching tests find a bug with VaryByParam

中找到了引用的内容
  

OutputCache之间的区别   指令设置为“客户端”和   “ServerAndClient”就是这样   “ServerAndClient”输出Vary   领域。这影响了IE中的IE   无论如何发送请求。   使用vary:*标头可以禁用   所有客户端缓存   (http://msdn2.microsoft.com/en-us/library/system.web.httpcachepolicy.setomitvarystar.aspx)。

     

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

答案 3 :(得分: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