2012-02-09 132 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

相关问题