我的静态内容缓存在客户端上有问题(静态我的意思是js,css,jpeg,gif等)。 (并且客户端我的意思是我的开发机器大多数时间)。
因此,页面要么抛出脚本错误,要么无法正确显示。我不是Rails开发人员,但我及时读了几本关于它的书。我记得很清楚的一点是,它会在包含文件的末尾添加一些魔术版本号,因此它变为
<script src="~/Scripts/Invoice.js?201112091712" type="text/javascript"></script>
如果您修改该内容文件,它会生成一个新的版本号,因此它会生成一个不同的include语句,因此,客户端认为它是一个新内容,并在不检查其缓存的情况下加载它。
asp.net-mvc 3&amp; IIS 7支持这个,或者你知道任何模仿这种行为的工具吗?
谢谢,Hazım
答案 0 :(得分: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 :(得分:1)
我做了类似的事情:
<script src="<%= GenerateScriptUrl("~/Scripts/Invoide.js") %>"></script>
在GenerateScriptUrl
方法中,我编写文件的内容,计算md5值,然后获取版本号的url。该URL将被缓存,因此将被计算两次。我还创建了一个处理程序(不向用户公开)以清除缓存。因此,在更改文件内容时,无需重新启动该过程。
您还可以使用上次修改后的内容获取版本号。您甚至可以通过FileSystemWatcher
等来监控文件的更改。
希望它有所帮助。
答案 2 :(得分: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"/>