IIS7.5 outputCachemodule内核缓存“公共”忽略URL
-
09-10-2019 - |
题
在IIS 7.5上的ASP.NET 4应用程序中,在输出缓存方面具有一些奇怪的行为。我已经能够仅在其他空设置上重复问题,我敢肯定这是一个错误,但不确定如何向Microsoft报告。
IIS中的一个站点响应了一个以上的域,.NET应用程序会检查主机名,并相应地生成内容。例如,它可以在空白页中打印请求URL的名称。例如,www.first-domain.com和www.second-domain.com
web.config具有适当的缓存,URLCOMPRESSION和HTTPCOMPRESSION。
ASPX页面为公共设置了缓存控制标头,其未来日期或最大值值。
访问www.first-domain.com输出成功写入“ www.first-domain.com”的页面。
但是,访问www.second-domain.com输出一个写入“ www.first-domain.com”的页面。
检查失败的重新测试轨迹,system.web.caching.outputcachemodule已找到缓存的输出(即使.config文件已关闭函数),即使请求url url hostname是不同的,也可以匹配缓存,因此也匹配了。第二请求将在将二阶的正确页面出现之前,将第一个请求的结果输出到不同域。
将缓存控制设置为私有,或在Web中删除“ outputcache”模块。CONFIG解决了问题,同时保持了发送到浏览器的正确的缓存控制标头,但是显然,我无法利用内核缓存时的优势我需要它。
我找不到有关如何配置OutputCachemodule的任何MSDN文档。
是否有人经历过这个问题,我该如何启用内核缓存并考虑到URL主机名(而不将应用程序分开到IIS中的不同站点)。
谢谢。
更新:
添加setSlidingExpiration无效,因为无论请求主机名如何,内核缓存仍然可以缓存输出。现在唯一的情况是禁用输出缓存,或在每个域上运行该应用程序的重复实例 - 考虑到服务器性能下降,这将导致与使用输出缓存时获得的性能的增加,我们决定禁用此应用程序的输出缓存。
解决方案
9个月后没有提供任何答案,也没有找到解决方案,只有解决方法,也许这将在下一版本的IIS大于7.5 ...中得到解决。
--
添加setSlidingExpiration无效,因为无论请求主机名如何,内核缓存仍然可以缓存输出。现在唯一的情况是禁用输出缓存,或在每个域上运行该应用程序的重复实例 - 考虑到服务器性能下降,这将导致与使用输出缓存时获得的性能的增加,我们决定禁用此应用程序的输出缓存。
其他提示
我的问题非常相似,这里没有解决方案对我有帮助。
tldr: :强行删除 OutputCache
模块 Web.config
是我发现的唯一解决方案。
我的情况有些不同。
我在 Application_BeginRequest
, ,回答 Access-Control-Allow-Origin
对于给我打电话的特定主机(将其设置为 *
尚不可靠)。
我的控制器还设置了 Cache-control: public
因为它的回答。
我发现的
每当我设置时 Cache-control: public
, ,IIS强行缓存了反应。两者的断点 Application_BeginRequest
或我的控制器从未第二次击中。
通过IIS管理器禁用输出和内核缓存 以下 会让我击中 Application_BeginRequest
断点,但从未让我进入控制器。有些东西仍在缓存。
本文 建议从IIS中删除OutputCache模块会有所帮助。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="OutputCache" />
</modules>
</system.webServer>
这样做可以让我击中控制器。
什么会有所帮助
如果MS的某人是否可以发光,是否有一种改变这种行为的方法。 OutputCache在应用程序的某些部分中可能很有用,而在其他地方则可能是不必要的。
谨防
也许我(我们是?)在这里解决了错误的问题。
也许在这种情况下,IIS正在接管缓存,因为它应该。在我的服务器和用户之间的途中,也许在这种确切情况下的行为,如果是这种情况,那么在IIS上解决此问题是错误的。我必须弄清楚,也许你也应该这样做。
我有类似的问题。我使用自定义URL重写器。我有页面example.com/articles and example.com/art-any_id.html。两个URL映射到articles.aspx(在第二个示例中为articles.aspx?id = any_id)。它与ASP.NET 2.0和经典管道模式合作正常。将其更改为ASP.NET 4和集成模式后,我们都有奇怪的行为:两个URL返回相同的输出。它是任何页面,例如example.com/art-any_id.html。
现在我们删除了 <add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
从部分 <caching enabled="true" enableKernelCache="true">
而且很好。我不明白为什么http.sys缓存它。
您找到了任何解释吗?