2012-04-20 60 views
2

我在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

回答

0

緩存發生在客戶端,而不是服務器上。所以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