2011-12-09 35 views
3

我在客戶端緩存靜態內容時出現問題(靜態我的意思是js,css,jpeg,gif等)。 (並且客戶端大多數時候是指我的開發機器)。如何在版本信息中包含靜態內容

因此,頁面要麼拋出腳本錯誤,要麼顯示不正確。我不是一個Rails開發者,但我讀了幾本關於它的書籍。有一件事我記得很清楚的是,它附加一些神奇的版本號包含的文件的末尾,所以它成爲

<script src="~/Scripts/Invoice.js?201112091712" type="text/javascript"></script> 

,如果您修改內容文件會生成一個新的版本號,所以它生成一個不同的include語句,因此,客戶端認爲它是一個新內容,並且在不檢查緩存的情況下加載它。

是否asp.net-mvc 3 & IIS 7支持此操作,或者您是否知道任何模仿此行爲的工具?

謝謝,海濟

回答

6

我有這個已經做在我的項目之一,隨時如果你喜歡他們用我的助手:

public static class VersionedContentExtensions 
{ 
    public static MvcHtmlString VersionedScript(this HtmlHelper html, string file) 
    { 
     return VersionedContent(html, "<script src=\"{0}\" type=\"text/javascript\"></script>", file);      
    } 

    public static MvcHtmlString VersionedStyle(this HtmlHelper html, string file) 
    { 
     return VersionedContent(html, "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\">", file); 
    } 

    private static MvcHtmlString VersionedContent(this HtmlHelper html, string template, string file) 
    { 
     string hash = HttpContext.Current.Application["VersionedContentHash_" + file] as string; 
     if (hash == null) 
     { 
      string filename = HttpContext.Current.Server.MapPath(file); 
      hash = GetMD5HashFromFile(filename); 
      HttpContext.Current.Application["VersionedContentHash_" + file] = hash; 
     } 

     return MvcHtmlString.Create(string.Format(template, file + "?v=" + hash)); 
    } 

    private static string GetMD5HashFromFile(string fileName) 
    { 
     FileStream file = new FileStream(fileName, FileMode.Open); 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] retVal = md5.ComputeHash(file); 
     file.Close(); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < retVal.Length; i++) 
     { 
      sb.Append(retVal[i].ToString("x2")); 
     } 
     return sb.ToString(); 
    } 
} 

使用它們像這樣:

@Html.VersionedScript("/Scripts/sccat.core.js") 
1

我做了這樣的事情:

<script src="<%= GenerateScriptUrl("~/Scripts/Invoide.js") %>"></script> 

GenerateScriptUrl方法,我寫的文件的內容,計算出的MD5值,然後用得到的版本號的URL。該網址將被緩存,因此它將被計算兩次。我還創建了一個處理程序(不向用戶公開)來清除緩存。所以當文件內容被改變時,該過程不需要重新啓動。

您還可以獲取上次修改版本或版本的版本號。你甚至可以通過FileSystemWatcher等監視文件的變化等。

希望它有幫助。

+0

所以,你需要做任何事情來爲js文件(如處理程序),或IIS處理? – hazimdikenli

+0

好吧,我剛剛檢查IIS與服務文件,如「Invoice.js?20111209」好,這簡化了它。 – hazimdikenli

0

試試這個它增加了文件修改時間

public static class UrlHelperExtentention 
{ 
    public static string VersionedContent(this UrlHelper urlHelper, 
               string contentPath) 
    { 
     string versionedContent= urlHelper.Content(contentPath); 

     string modified= File.GetLastWriteTime(
           HostingEnvironment.MapPath(contentPath)) 
           .ToString("yyyyMMddhhmm"); 
     if (result.Contains('?')) 
      versionedContent += "&" + modified; 
     else 
      versionedContent += "?" + modified; 

     return versionedContent; 
    } 
} 

然後

<script src="@Url.VersionedContent("~/js/Home.js")" type="text/javascript"/> 
相關問題