2010-06-10 73 views
0

我有一個ASP.NET託管在IIS中的ASP.NET MVC網站。 有時我推送更改並且用戶的瀏覽器仍可能使用以前的文件,從而導致功能問題。 這是因爲瀏覽器正在緩存這些文件嗎? 我能做些什麼來確保用戶瀏覽器加載更新的文件?如何讓瀏覽器知道文件已更新? ASP.NET MVC

謝謝!

回答

1

做最簡單的事情是附加在URL作爲查詢字符串日期或版本號。喜歡的東西:

<link rel="stylesheet" href="http://mysite.com/styles.css?2010-06-10-0700"> 

<script type="text/javascript" src="http://mysite.com/js/main.js?v1234"></script> 

,因爲URL是不同的瀏覽器將要求一個新的文件。服務器將忽略查詢字符串(除非你正在做一些聰明的事情)。

etag /上次修改的建議很好,但沒有解決「告訴」瀏覽器存在新版本文件的問題。

+0

+1:是的,我已經略過了緩存失效的一面。 – 2010-06-11 00:47:50

1

這就是ETag,If-None-Match(或If-Not-Modified)和HTTP 304 resopnses的用途。

如果使用ETag標頭和可接受的緩存策略發送文件,瀏覽器將緩存該文件,並且對於每個後續請求都會發送If-None-Match標頭。

Web服務器應檢查文件的生成ETag是否與If-None-Match請求匹配,並返回包含新內容的HTTP 200或指示緩存版本仍爲最新的HTTP 304。

這裏是我是如何在ASP.NET MVC 1.0使用它:

public ActionResult ViewAvatar(long id) 
{ 
    UserAvatar avatar = this.AppManager.GetUserAvatar(id); 

    if (avatar != null && true) 
    { 
     byte[] imageData = avatar.Avatar.ToArray(); 

     string eTag = LanLordzApplicationManager.CalculateMd5(imageData); 

     if (this.Request.Headers["If-None-Match"] == eTag) 
     { 
      return this.NotModified(
       HttpCacheability.Public, 
       DateTime.Now.AddMinutes(2) 
      ); 
     } 

     string mimeType = this.AppManager.GetImageMimeType(imageData); 

     return this.Image(
      imageData, 
      mimeType, 
      HttpCacheability.Public, 
      DateTime.Now.AddMinutes(2), 
      eTag 
     ); 
    } 
    else 
    { 
     return this.HttpError(404, this.View("NotFound")); 
    } 
} 
+0

感謝您的回覆。 那麼我應該在我更新的控制器中設置Response的狀態代碼嗎?(對不起,不瞭解這個ETag的東西) 如果更新後的文件是js或css,該怎麼辦? – fishiefishie 2010-06-10 15:25:49

+0

那麼,.JS和.CSS文件通常由Web服務器直接發送,而不是通過ASP。您將不得不在IIS設置下配置緩存。也就是說,您可能需要降低緩存時間,並使用ETags。 – 2010-06-10 15:27:33

相關問題