我在我的MVC应用程序中使用标准的outputcache标签,效果很好,但我需要强制它在某些时候被转储。我该如何实现这一目标?缓存的页面是从一个非常简单的路径构建的{Controller} / {PageName} - 因此大多数页面都是这样的:/ Pages / About-Us
这是我的.aspx视图页面顶部的输出缓存标记,只是为了清楚:
<@ OutputCache Duration="100" VaryByParam="None" %>
因此,在内容更新的同一控制器上的另一个操作中,我需要转储此缓存,甚至是所有缓存 - 这是一个非常小的应用程序,因此转储所有缓存项目并不是一件大事。
答案 0 :(得分:16)
小心使用“无”与“”。
我使用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