3

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

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

web.config 在 system.webServer 节点下有适当的缓存、urlCompression 和 httpCompression 全部关闭。

aspx 页面为 public 设置缓存控制标头,带有一个未来的到期日期,或者一个 max-age 值。

访问 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,第二个请求就会将第一个请求的结果输出到不同的域,然后才会出现第二个域的正确页面。

将缓存控制设置为私有,或删除 web.config 中的“OutputCache”模块可以解决问题,同时保持发送到浏览器的正确缓存控制标头,但显然,我无法利用内核缓存我需要它。

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

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

谢谢。

更新:

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

4

3 回答 3

2

9个月后没有给出答案,也没有找到解决方案,只有一个解决方法,也许这个会在IIS大于7.5的下一个版本中修复...

--

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

于 2011-10-08T16:36:10.670 回答
2

我遇到了一个非常相似的问题,这里没有解决方案对我有帮助。

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

我的情况有点不同。

我在 中设置了 CORS Application_BeginRequestAccess-Control-Allow-Origin为呼叫我的特定主机接听(将其设置为*不可靠)。

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

我发现了什么

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

如下所示,通过 IIS 管理器禁用输出和内核缓存会让我遇到Application_BeginRequest断点,但从来没有让我进入控制器。某些东西仍在缓存响应。 在 inetmgr 上禁用输出缓存和内核缓存

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

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

这样做让我终于可以击中我的控制器。

什么会更有帮助

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

谨防

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

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

于 2016-08-05T15:25:52.053 回答
0

我有类似的问题。我使用自定义 url 重写器。我有页面 example.com/articles 和 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 缓存它。

你找到任何解释了吗?

于 2013-05-22T12:55:57.897 回答