【问题标题】:ASP.NET caching in IIS and hostnamesIIS 和主机名中的 ASP.NET 缓存
【发布时间】:2012-05-02 00:32:02
【问题描述】:

我在 ISS 运行一个 MVC3 网站。我们有一个从数据库中获取图像的控制器。实际获取哪个图像取决于请求的主机名,例如http://hostA.site.com/image/23 返回与 http://hostB.site.com/image/23 不同的图像,即使两个 url 都引用 IIS 中的相同应用程序。

在启用缓存之前,这可以正常工作。我使用以下代码来允许在服务器和客户端上进行缓存:

Response.Cache.SetExpires(DateTime.Now.AddHours(1));
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);

这会导致 IIS 缓存响应,这正是我们想要看到的。然而,IIS 在缓存时似乎并没有区分不同的主机名。当我第一次获取http://hostA.site.com/image/23 时,对http://hostB.site.com/image/23 的后续调用会导致IIS 返回从前一个请求缓存的图像。我认为发生这种情况是因为 IIS 认为这些请求是相同的,因为它们具有相同的站点和相同的 URI。

有没有人知道一种无需为每个主机创建不同应用程序的方法来完成这项工作?我现在已经为 Private 设置了 Cacheability,但我真的很想让 IIS 缓存这些图像。

【问题讨论】:

  • 您在此处放置的命令是针对客户端的。如果您将其缓存在代码后面,那么代码当然不知道提供了什么 url。如果你使用它,你能看到和改变服务器缓存吗?
  • 缓存发生在服务器上(当我设置 HttpCacheability.Public 时),我使用 wget 验证了这一点,它不会在本地缓存。一旦我设置了 HttpCacheability.Private IIS 就会停止缓存。我不知道如何进入 IIS 的内部缓存,所以我不知道那里发生了什么。

标签: asp.net asp.net-mvc-3 iis caching


【解决方案1】:

缓存发生在客户端,而不是服务器上。所以 IIS 不是这里的问题,除非您使用它来提供内容过期标头。

如果两个 URL 都引用同一个应用程序,那么无论 URL 是什么,您最终都会添加相同的过期标头。除非您明确查看调用 URL 并相应地调整您发送的响应,否则该代码将在这两种情况下运行。

var url = Request.Url.Host;
// Determine which host was called.
// Adjust cache to either 0 or 1 hour based on this

【讨论】:

  • 缓存设置不是问题,每个主机都应该相同。然而,每个 Request.Url.Host 的响应内容应该不同。我已经开始工作了,但是当我设置 HttpCacheability.Public IIS 在发出对 SiteB 的请求时开始返回对 SiteA 的先前调用的响应时,我使用 wget 验证了这一点。调试器还显示,在对 SiteA 的请求之后立即完成对 SiteB 的请求时,代码未命中。当我设置 HttpCacheability.Private 时,一切都再次正常工作,但我实际上希望 IIS 缓存(但正确)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多