过期输出缓存 ASP.Net MVC

Posted

技术标签:

【中文标题】过期输出缓存 ASP.Net MVC【英文标题】:Expire Output Cache ASP.Net MVC 【发布时间】:2010-09-27 11:19:08 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

小心使用“无”与“”。

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

我使用Fiddler 来验证此行为。

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

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

【讨论】:

是的,这是怎么回事?如果将 VaryByParam 设置为“none”,为什么它会发送“Vary: *”? 已确认,当您执行Varies="none" 时,您会在响应中获得标题Vary: *。当您执行Varies="" 时,您不会得到这样的标题。 或者,要删除 Vary: *,请使用 this.Response.Cache.SetOmitVaryStar(true); @KevinHakanson:或者,在您的web.config:&lt;caching&gt;&lt;outputCache omitVaryStar="true" /&gt;&lt;/caching&gt; 中为您的整个应用程序设置它。 这是有用的信息,但似乎不能回答所提出的问题,至少在没有上下文的情况下不能。 @Slee,您是否将这个答案与另一个答案结合起来?如果是这样,我们应该编辑这个答案以包含必要的更多基本信息。你如何转储输出缓存?以及“小心无”与“””与这个问题有何关系?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

不知道 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:* 标头从而允许客户端缓存的唯一方法是通过代码:

【讨论】:

【参考方案4】:

似乎输出缓存没有在 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

【讨论】:

难道HttpContext.Cache 和OutputCache 不一样吗?我可能是错的,但你的例子是处理 HttpContext.Cache。 @Zach 是的,他们没有真正的关系。

以上是关于过期输出缓存 ASP.Net MVC的主要内容,如果未能解决你的问题,请参考以下文章

MVC asp.net 从网络文件夹加载图像

ASP.net 缓存绝对过期不起作用

使用 jscript 和控制器操作将数据添加到使用 MVC ASP.net 的数据库

如何在 MVC ASP.NET 中的手机号码前添加默认(默认为浏览器国家)国家代码?

配置 antiforgerytoken 单次使用 mvc asp.net

asp.net 滑动缓存 总是3分钟左右过期为啥?优先级已经是NotRemovable