2009-06-05 36 views
14

關於如何在asp.net應用程序中進行瀏覽器緩存的任何建議。我在網上發現了一些不同的方法,但不確定什麼是最好的。具體來說,我想緩存我的CSS和JS文件。他們確實會改變,但通常最多隻有一個月一次。ASP.NET應用程序中的瀏覽器緩存

+0

看到這個問題: http://stackoverflow.com/questions/914027/disabling-browser-caching-for-all-browsers-from-asp-net – 2010-07-21 23:38:11

回答

6

另一種技術是將靜態圖像,css和js存儲在其他服務器(例如CDN)中,該服務器的Expires標頭設置正確。這樣做的好處是雙重的:

  1. Expires頭將鼓勵瀏覽器和代理緩存從你的服務器提供靜態文件,這些靜態文件
  2. 的CDN將卸載。
  3. 通過爲您的靜態內容使用另一個域名,瀏覽器將更快下載。這是因爲serving resources from four or five different hostnames increases parallelization of downloads
  4. 如果CDN配置正確,並使用cookieless domain,那麼你沒有不必要的cookies來回。
3

你最好這樣做,是在IIS中設置一個Expires頭文件,用於緩存你想要的內容。這將告訴大多數現代瀏覽器和代理緩存這個靜態內容。在IIS 6中:

  1. 右鍵單擊想要由瀏覽器緩存的文件夾(例如CSS或JS)。
  2. 單擊屬性
  3. 轉到HTTP頭選項卡
  4. 選中「啓用內容過期」
  5. 設置一些長週期到期,

雅虎開發者博客talks about this technique像「後90天過期」 。

+0

我沒有訪問IIS的權限。我想我正在尋找的是通過代碼實現它的好方法。 – Jason 2009-06-05 13:28:49

2

除非您將IIS配置爲給予js/css/image請求的asp.net控件,否則默認情況下它不會看到它們,因此您的最佳計劃(用於長期可維護性)是故意調整防火牆上的響應標頭/ trafficmanager /服務器(更好,什麼世界上大多數國家確實在這一點),以版本的文件路徑,即:

而是在你的加價寫這個的:

http://www.foo.com/cachingmakesmesad.css 

使用這個:

http://www.foo.com/cachingmakesmesad.css?v1 

..並在需要有效清除緩存時更改版本號。如果每次都是這樣,那麼你甚至可以追加一個GUID或日期戳,但我想不出任何我想要做的事情。


我覺得你的問題是反緩存,但在重新閱讀它,我看到我浪費了有一個很好的答案:P

長話短說,瀏覽器通常非常積極的親緩存「簡單」資源所以你不必擔心這個問題,但是如果你真的想做點什麼的話,你將不得不通過防火牆/ trafficmanager/IIS來獲得上述原因(ASP.NET將不會有機會默認)。

但是...有沒有辦法可以絕對強制緩存,也不應該。什麼是和不被緩存是最終用戶的決定,你所能做的就是強烈要求。

4

值得注意的是,即使沒有Cache-Control或Expires標頭,大多數瀏覽器都會緩存JS和CSS等內容。但是,瀏覽器應該會在每次需要時請求資源,但通常會得到「304未修改」響應,然後瀏覽器使用緩存的項目。由於它往返服務器,這仍然是相當昂貴的,但資源本身並未發送,因此傳輸的字節數量有限。

IE沒有關於緩存的具體指示,默認情況下會使用它自己的啓發式來確定它是否應該重新請求緩存的項目。儘管沒有被明確告知它可以緩存資源。它的基礎是資源的Last-Modified日期,年代越久,它現在改變的可能性就越小,這是它的典型推理。很毛茸茸。

坦率地說,如果你想做一個網站perfomant你需要控制這種緩存設置。如果您無法訪問這些設置,請不要擔心其性能。只要通知贊助商它可能表現不佳,因爲他們沒有爲您提供一個可以讓您提供的平臺。

2

在.net中,您可以將JavaScript,CSS和圖像設置爲嵌入式資源。 .Net然後將爲您處理文件到期。 這種方法的缺點是你必須爲每一組更改做一個新的構建(這可能是一個好處,取決於你的部署和工作流程)。

你也可以使用ETags,但從我的理解,在某些情況下,如果你有IIS and apache Webservers hosting your images(或者如果你打算將來切換)混合使用,它不會很好。

您可以確保文件日期更新,並讓服務器爲您處理,但您必須確保服務器配置正確。

2

您可以通過添加以下代碼在web.config中

<system.webServer> 
    <staticContent> 
     <clientCache httpExpires="Tue, 12 Apr 2016 00:00:00 GMT" cacheControlMode="UseExpires" /> 
    </staticContent> 
</system.webServer> 

有關詳細信息,請參閱clientCache documentation緩存靜態內容。