2011-09-23 72 views
3

我發現很多有關獲取瀏覽器以避免緩存動態內容(例如.aspx頁面)的好信息,但是我沒有成功獲取瀏覽器來緩存我的靜態內容,特別是css,javascript和圖像文件。使用ASP.Net,如何爲靜態內容啓用瀏覽器緩存並禁用動態內容?

我一直在使用Application.BeginRequest Global.asax沒有成功。爲靜態內容分配服務器不是我們的選擇。我也想避免必須配置IIS設置,除非它們可以通過web.config進行控制。爲aspx頁面禁用緩存是否會影響顯示在其上的靜態內容的緩存?

如果此問題已被回答,我很抱歉。

作爲討論的起點,下面是我的Global.asax文件的代碼。

public class Global_asax : System.Web.HttpApplication 
{ 
    private static HashSet<string> _fileExtensionsToCache; 

    private static HashSet<string> FileExtensionsToCache 
    { 
     get 
     { 
      if (_fileExtensionsToCache == null) 
      { 
       _fileExtensionsToCache = new HashSet<string>(); 

       _fileExtensionsToCache.Add(".css"); 
       _fileExtensionsToCache.Add(".js"); 
       _fileExtensionsToCache.Add(".gif"); 
       _fileExtensionsToCache.Add(".jpg"); 
       _fileExtensionsToCache.Add(".png"); 
      } 

      return _fileExtensionsToCache; 
     } 
    } 

    public void Application_BeginRequest(object sender, EventArgs e) 
    { 
     var cache = HttpContext.Current.Response.Cache; 

     if (FileExtensionsToCache.Contains(Request.CurrentExecutionFilePathExtension)) 
     { 
      cache.SetExpires(DateTime.UtcNow.AddDays(1)); 
      cache.SetValidUntilExpires(true); 
      cache.SetCacheability(HttpCacheability.Private); 
     } 
     else 
     { 
      cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
      cache.SetValidUntilExpires(false); 
      cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
      cache.SetCacheability(HttpCacheability.NoCache); 
      cache.SetNoStore(); 
     } 
    } 
} 

回答

9

如果你正在使用IIS7 &,你希望緩存靜態內容添加以下在web.config:

<staticContent> 
<clientCache httpExpires="Sun, 27 Sep 2015 00:00:00 GMT" cacheControlMode="UseExpires" /> 
</staticContent> 
+0

太棒了!太簡單了。我以前遇到的問題(從Application_BeginRequest控制緩存)與使用Visual Studio Development Server有什麼關係?另外,是否有類似的動態內容標籤? –

+1

我不認爲Visual Studio Development Server與它有任何關係。你打算使用頁面緩存嗎?如果是,您可以使用web.config設置來控制持續時間。 –

+0

我想確保動態內容不會被緩存。 Application_BeginRequest中的代碼做得很好。我已將.axd添加到_fileExtensionsToCache,這似乎阻止了瀏覽器緩存設置在此處被覆蓋。只是詢問是否有更好的方法來做到這一點,即在web.config中。 –

2

神奇的是通過HTTP頭 - 見這page

+0

不應該「cache.SetExpires(DateTime.UtcNow.AddDays(1))」行將過期日期添加到響應標頭? –

+1

是的,它應該,也許問題是在SetCacheAbility方法,請參閱http://codeclimber.net.nz/archive/2007/04/01/Beware-the-ASP.NET-SetCacheability-method.aspx –

+0

好文章。謝謝! –