2011-08-20 40 views
2

T4MVC有一个设置AddTimestampToStaticLinks这更增加了URL文件的最后更改时间:AddTimestampToStaticLinks是否缓慢?

/Content/nerd.jpg?2009-09-04T12:25:48

正是在非常方便作为经常改变的文件的开发不会被浏览器缓存。但是我应该保留它用于生产吗?它有多慢?我甚至不确定它是如何工作的。谁会将“/Content/nerd.jpg?2009-09-04T12:25:48”转换为“/Content/nerd.jpg”?一些IIS模块?

回答

2

我应该保留它以进行生产吗?

是的。它为用户提供了与开发相同的好处。

它有多慢?我甚至不知道它是如何工作的。

我没有时间安排,但是对于您的目的而言,它可能会快速忽略不计。它检查实际文件上的最后修改日期,生成tick计数差异的散列,并使用字符串连接将其附加到url。您可以检查自己,因为t4模板只是文本文件。它的代码看起来像这样在我的版本:

static DateTime CenturyBegin=new DateTime(2001,1,1); 
public static string TimestampString(string virtualPath) { 
    if (!HostingEnvironment.IsHosted) return string.Empty; 
    string filePath = HostingEnvironment.MapPath(virtualPath); 
    return Convert.ToString((System.IO.File.GetLastWriteTimeUtc(filePath).Ticks-CenturyBegin.Ticks)/1000000000,16);    
} 

如果不够快,你的目的,你可以修改的附加时间戳的东西足够快的方法。不太精确但速度更快的方法就像装配体内部编号或您在构建过程中手动更改的内容。使用默认设置将会使得只有被修改的文件会被缓存失效。

谁不作转换 “/Content/nerd.jpg?2009-09-04T12:25:48” 到 “/Content/nerd.jpg” 的魔力呢?

使用HTTP,您可以追加查询字符串到任何请求。大多数服务器实现只是忽略静态文件的查询字符串,但是它们将不同的查询字符串视为单独的请求,因此只要它们被创建就可以立即获得更新。

即使您不更改文件,只需将url + query字符串更改为客户端没有缓存的内容即可强制浏览器重新加载内容。

+2

很好的答案。另一个重要的一点是,时间戳是在一个静态字段中计算的,这意味着它只发生在每个appdomain一次。所以它实际上不会有任何性能的影响,除非你的应用第一次启动(或重置)时非常小。 –

+0

@David Ebbo,为什么不默认启用它呢? :) – SiberianGuy

+0

不知道,它可能是。 :)这个功能是由其他人提供的,当时我们只是想保证它的安全,而不是打破任何人。 –

相关问题