2012-02-09 64 views
4

因此,我正在使用C#.NET構建一個Web應用程序,並且想要爲文件引用添加版本號。例如:在C#.NET中,如何將版本號添加到靜態文件引用,如HTML和CSS?

<script src="mysite/scripts/default.123.js"></script> 

每一次我在Web應用程序,包括CSHTML,CSS,JS,圖像或修改文件,是有可能有動態增加該版本號? 換句話說,我如何首先獲得[或創建]版本號?可能嗎?

這是爲了避免在客戶端瀏覽器上緩存舊副本,尤其是通過XHR提供服務時。由於我不想花時間解釋的原因,我不會要求替代方法,如傻傻參數,無緩存元標記,日期時間戳,CDN等。

我希望這個數字對應到被修改的文件的最新版本 - 也許「構建版本」不是正確的詞。作爲Kyle Trauberman,assemblyversion可能會起作用。但是,這是否適用於更改靜態資源,如HTML或CSS?什麼是一個好的方法呢?

回答

7

爲了解決這個問題,我採用了一種稍微不同的方法。我只需追加上次修改日期,而不是使用「版本號」。爲了使事情方便,我寫了一個輔助方法:

public static HtmlString Script<T>(this HtmlHelper<T> html, string path) 
{ 
    var file = html.ViewContext.HttpContext.Server.MapPath(path); 
    DateTime lastModified = File.GetLastWriteTime(file); 

    TagBuilder builder = new TagBuilder("script"); 
    builder.Attributes["src"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss"); 
    return new HtmlString(builder.ToString()); 
} 

然後在你的看法(不知道,如果你使用MVC,但解決的辦法是在兩種情況下類似的),你可以使用:

@Html.Script("/Scripts/common.js") 

將輸出:

<script src="/Scripts/common.js?modified=20120129025804"></script> 

注:網頁速度是不愉快的使用的查詢字符串。但是,我試圖將其改爲使用「/」,導致MVC接管文件的路由,並阻止IIS處理它。不知道如何解決這個問題。

+0

看起來很有希望,但是我想這樣放置#:common.123.js。我想這只是一個字符串生成器,所以應該很容易做到。 – Joshua 2012-02-09 22:10:41

+0

@Josh將版本放在文件名中而不是查詢字符串中的缺點是,當進行更新時,您需要將該文件的所有引用更新爲新的文件名,這可能非常耗時且乏味。使用查詢字符串,您不需要執行此操作。 – 2012-02-09 22:13:32

+0

@Josh我想你可以定義一個自定義路由,如果你在將版本號放在文件名中死定了。 – 2012-02-09 22:14:40

2

爲了避免舊版本的文件緩存,可以追加一個查詢字符串的URL:

<script src="mysite/scripts/default.js?v=123" /> 

傳遞給查詢字符串的值是無關緊要,因爲你很可能會被忽略它服務器端。這可以防止瀏覽器緩存文件。 您可以將項目的assemblyversion放在查詢字符串中,以允許緩存文件,除非更新項目。

+0

@Josh爲什麼downvote?我回答了你在問題中突出顯示的問題。請參閱我答案中的粗體文字。 – 2012-02-09 22:00:14

+0

我downvoted你的答案,因爲我看到的第一件事是你告訴我做其他的東西比我問。事實上,我特別說明我不想要替代方法。在重新閱讀你的答案中的大膽部分時,assemblyversion可能就是我正在尋找的東西。這包括對CSS或JS資源文件所做的更改嗎? (不僅僅是已編譯的應用程序) – Joshua 2012-02-09 22:03:37

+0

它只包含對已編譯應用程序的更改,但如果您在AssemblyInfo.cs中使用自動遞增版本(例如1.0。*),那麼當您重建和部署。 – 2012-02-09 22:06:15

2

代替把版本作爲文件名的一部分,你可以把它作爲結尾的查詢字符串,即:

<script src="mysite/scripts/defualt.js?v=123" > </script> 

我相信大部分現代瀏覽器尊重這一點,但我不」不知道它是否會在所有瀏覽器中100%有效。

而且,作爲一個快速之外,我明白你的例子可能是,只是一個例子,但你不應該使用一個自閉合外部腳本標記,它使大多數瀏覽器的問題。

+1

請閱讀我的帖子。我如何首先獲得版本號? – Joshua 2012-02-09 22:00:03

+0

感謝您對自動關閉腳本的說明。我只是一個例子 - geez,你的stackoverflow的人不讓任何東西通過,是嗎? :) – Joshua 2012-02-09 22:16:35

+0

@Josh我們是完美主義者。 – 2012-02-09 22:18:05

相關問題