AddTimestampToStaticLinks缓慢吗?

时间:2011-08-20 11:37:35

标签: asp.net-mvc t4mvc

T4MVC有一个AddTimestampToStaticLinks设置,它会添加到url文件的最后更改时间:

  

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

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

1 个答案:

答案 0 :(得分:2)

  

我应该保留它吗?

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

  

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

我没有时间安排,但对于你的目的来说,它可能是可以忽略不计的。它检查实际文件上的最后修改日期,生成滴答计数差异的散列,并使用字符串连接将其附加到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 +查询字符串更改为客户端未缓存的内容来强制浏览器重新加载内容。