在IIS和主机名中缓存ASP.NET

问题描述:

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

这工作正常,直到缓存启用。我用下面的代码,以使服务器和客户端的缓存都:

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缓存这些图像。

+0

您在这里放置的命令是针对客户端的。如果您将代码缓存在代码的后面,则代码不知道提供哪个url。如果使用它,你能看到并更改服务器缓存吗? – Aristos 2012-04-20 12:12:24

+0

缓存发生在服务器上(当我设置HttpCacheability.Public时),我使用wget验证了这一点,它不会在本地进行缓存。一旦我设置HttpCacheability.Private IIS停止缓存。我不知道如何进入IIS的内部缓存,所以我不知道那里发生了什么。 – AVee 2012-04-23 12:30:58

缓存发生在客户端,而不是服务器上。所以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 
+0

缓存设置不是问题,它应该是每个主机相同。但是对于每个Request.Url.Host,响应内容应该不同。我有这个工作,但是当我设置HttpCacheability.Public IIS开始返回对SiteB的请求时,前一次调用的响应,我使用wget验证了这一点。调试程序还显示,在请求SiteA后立即完成对SiteB的请求时,代码未被命中。当我设置HttpCacheability.Private一切工作再次,但我实际上希望IIS缓存(但正确)。 – AVee 2012-04-23 12:29:53