IIS7.5 OutputCacheModule内核缓存'public'忽略URL

时间:2011-01-09 23:55:22

标签: iis iis-7.5 outputcache cache-control

在IIS 7.5上的ASP.NET 4应用程序中有关于输出缓存的一些奇怪行为。我已经能够在其他空设置上重复这个问题,我确定这是一个错误,但不确定如何向微软报告。

IIS中的站点响应多个域,.NET应用程序检查主机名,并相应地生成内容。例如,它可以在空白页中打印请求URL的名称。例如,www.first-domain.com和www.second-domain.com

web.config在system.webServer节点下关闭了相应的缓存,urlCompression和httpCompression。

aspx页面为public设置缓存控制标头,其中包含将来的过期日期或最大年龄值。

访问www.first-domain.com会输出成功写入'www.first-domain.com'的页面。

但是,访问www.second-domain.com会输出一个写有'www.first-domain.com'的页面。

检查失败的请求跟踪,System.Web.Caching.OutputCacheModule找到了缓存的输出(即使.config文件已关闭该功能),即使请求URL主机名不同,缓存也已匹配,因此,只要设置了max-age / expiry,第二个请求就会将第一个请求的结果输出到不同的域,在第二个域的正确页面出现之前。

将cache-control设置为private,或者删除web.config中的'OutputCache'模块可以解决问题,同时保持发送到浏览器的正确缓存控制头,但显然,我无法利用我需要时进行内核缓存。

我找不到有关如何配置OutputCacheModule的任何MSDN文档。

有没有其他人遇到过此问题,如何启用内核缓存并让它考虑URL主机名(不将应用程序分离到IIS中的不同站点)。

感谢。

更新

添加SetSlidingExpiration无效,因为无论请求主机名如何,内核缓存仍会缓存输出。现在唯一的情况是要么禁用输出缓存,要么在它将运行的每个域上运行应用程序的重复实例 - 考虑到服务器性能的下降,这将导致使用输出缓存所获得的性能提升,我们决定禁用此应用程序的输出缓存。

3 个答案:

答案 0 :(得分:2)

9个月后没有提供任何答案,并且没有找到解决方案,只有一种解决方法,也许这将在下一版本的IIS中修复,大于7.5 ......

-

添加SetSlidingExpiration无效,因为无论请求主机名如何,内核缓存仍会缓存输出。现在唯一的情况是要么禁用输出缓存,要么在它将运行的每个域上运行应用程序的重复实例 - 考虑到服务器性能的下降,这将导致使用输出缓存所获得的性能提升,我们决定禁用此应用程序的输出缓存。

答案 1 :(得分:2)

我遇到了一个非常类似的问题,这里没有任何解决方案可以帮助我。

TLDR :强行删除OutputCache上的Web.config模块是我找到的唯一解决方案。

我的情景有点不同。

我在Application_BeginRequest设置了CORS,对于给我打电话的特定主机回答Access-Control-Allow-Origin(将其设置为*并不可靠)。

我的控制器还为Cache-control: public设置了响应。

我找到了什么

每当我设置Cache-control: public时,IIS都会强制缓存响应。 Application_BeginRequest或我的控制器上的断点从未被第二次击中。

通过IIS管理器禁用输出和内核缓存,如下面的 ,我会点击Application_BeginRequest断点,但从未让我进入控制器。还有什么东西还在缓解反应。 disabled output caching and kernel caching on inetmgr

This article建议从IIS中删除OutputCache模块会有所帮助。

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="OutputCache" />
  </modules>
</system.webServer>

这样做让我最终击中了我的控制器。

什么会有所帮助

如果来自MS的某人能够发光,是否有办法改变这种行为。 OutputCache在应用程序的某些部分可能很有用,而在其他部分则没有用。

<强>当心

也许我(我们是?)在这里解决了错误的问题。

也许IIS在这种情况下接管了缓存,因为它应该。也许我的服务器和用户之间的代理在这种情况下的行为就像那样,如果是这种情况,那么在IIS上解决这个问题是错误的。我必须弄清楚,也许你也应该这样做。

答案 2 :(得分:0)

我有类似的问题。我使用自定义网址重写器。我有页面example.com/articles和example.com/art-ANY_ID.html。两个url都映射到articles.aspx(在第二个示例中为articles.aspx?id = ANY_ID)。它在ASP.NET 2.0和Classic管道模式下运行良好。在我们将其更改为ASP.NET 4和集成模式之后,我们遇到了奇怪的行为:两个url都返回相同的输出。它是像example.com/art-ANY_ID.html这样的任何页面。

现在我们从<add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />部分删除了<caching enabled="true" enableKernelCache="true">,但效果很好。我不明白为什么http.sys缓存它。

你找到任何解释吗?