我有一个与缓存失效技术有关的问题......我正在尝试为我的网站实现一种机制,它会自动使浏览器缓存无效(css,images ...)。每当我更新网站(更改图像或样式)时,我希望能够以编程方式使浏览器缓存无效;
例如:对于当前版本,css和一些图像已经改变。在这种情况下,我希望在更新完成后,当用户对网站执行请求时,他的浏览器缓存会自动失效,从而迫使重新下载新的图像和样式。这应该只针对客户端的第一个请求...应该从缓存中检索以下内容(因此设置no-cache pragma是不可能的)。
这是我尝试过的: 在BeginRequest事件处理程序中,我添加了以下行: Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); Response.Cache.SetETag( “\” e111293b17594f1487d136ea7e9314ac \ “”);
这会在响应标头中设置ETag。我想如果我在每个版本中更改此ETag,并在每个请求中设置它,缓存将失效,但似乎不是。我使用Live HTTP标头查看结果,并且为响应正确设置了ETAG,但css和图像仍然从缓存中获取....
关于如何实现这一目标的任何想法,或者它是否可以完成?
提前致谢!
答案 0 :(得分:5)
过去我遇到过这样的问题。不幸的是,我找不到一个非常好的方法来完成这个,所以我不得不想出一个解决方法。我只处理CSS文件的这个问题,所以我为每个CSS引用添加了一个额外的查询字符串参数,例如
<link rel="stylesheet" type="text/css"
href="default.css?buildnumber=<%= Buildnumber %>" />
随着每个版本的增加,内部版本号会增加,因此浏览器被迫去寻找这个新文件。不是一个理想的解决方案,但它顺利运作。
答案 1 :(得分:1)
对于那些正在寻求 MVC5 解决方案的人:
Step1:将项目的AssemblyInfo.cs文件改成如下
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
第 2 步:创建一个类以获取项目的当前版本信息:
public class Versioner
{
public static Version GetVersion()
{
Assembly thisAssem = typeof(Versionador).Assembly;
AssemblyName thisAssemName = thisAssem.GetName();
Version vrs = thisAssemName.Version;
return vrs;
}
//Not really necessary, just if you need to show this info
public static string GetDataBuild()
{
Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"{version} ({buildDate})";
return displayableVersion;
}
}
第 3 步:调用视图中需要缓存自动刷新的类方法。
@{
Version _ver = <MyProject>.Classes.Extensions.Versioner.GetVersion();
}
//here, <MyProject>.Classes.Extensions is my path to the Versioner.cls class file, adjust it to your project's classes path
第 4 步:使用带有版本字符串的变量附加到您的脚本或 .css 文件中
<script src="~/js/index.js?v=@_ver"></script>
<link href="/css/style.css?v=@_ver" rel="stylesheet" />