在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无效,因为无论请求主机名如何,内核缓存仍会缓存输出。现在唯一的情况是要么禁用输出缓存,要么在它将运行的每个域上运行应用程序的重复实例 - 考虑到服务器性能的下降,这将导致使用输出缓存所获得的性能提升,我们决定禁用此应用程序的输出缓存。
答案 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
断点,但从未让我进入控制器。还有什么东西还在缓解反应。
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缓存它。
你找到任何解释吗?