16

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

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

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

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

4

4 回答 4

16

小心使用“无”与“”。

  • 如果您发送“”,则不会发送Vary的 HttpHeader 。
  • 如果您发送“无”,则发送Vary 的 HttpHeader 。

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

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

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

于 2009-01-28T01:05:52.950 回答
15

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

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

于 2008-12-18T03:58:19.300 回答
7

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

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

这段代码“修复”了这个Vary: *问题:

this.Response.Cache.SetOmitVaryStar(true);

我在 ASP.NET 缓存测试中发现引用了 VaryByParam 的错误

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

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

于 2010-08-13T22:25:27.407 回答
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
于 2008-12-18T04:19:55.730 回答