我有一个与缓存失效技术相关的问题...我正在尝试为我的网站实现一种机制,它会自动使浏览器缓存(css,图像...)失效。每当我更新网站(更改图像或样式)时,我希望能够以编程方式使浏览器缓存无效;
例如:在当前版本中,css和一些图像发生了变化。在这种情况下,我希望在更新完成后,当用户对网站执行请求时,其浏览器的缓存将自动失效,从而强制重新下载新的图像和样式。应该只对客户端的第一个请求执行此操作...下面的代码应该从缓存中检索(所以设置no-cache杂注是不可能的)。
下面是我尝试过的内容:在Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);Response.Cache.SetETag("\"e111293b17594f1487d136ea7e9314ac\"");的BeginRequest事件处理程序中,我添加了以下行:
这将在响应头中设置ETag。我认为,如果我在每次发布时更改此ETag,并在每次请求时设置它,缓存将无效,但似乎并非如此。我使用Live HTTP头来查看结果,ETAG已为响应正确设置,但css和图像仍然是从缓存中获取的……
有没有什么想法可以让我做到这一点,或者我能不能做到?
提前感谢!
发布于 2009-11-27 00:06:00
我在过去遇到过这样的问题。不幸的是,我找不到一个很好的方法来完成这个任务,所以我不得不想出一个变通的办法。我只处理CSS文件的这个问题,所以我为每个CSS引用添加了一个额外的querystring参数,例如
<link rel="stylesheet" type="text/css"
href="default.css?buildnumber=<%= Buildnumber %>" />每个版本的内部版本号都会递增,所以浏览器不得不去寻找这个新文件。这不是一个理想的解决方案,但它工作得很顺利。
发布于 2021-01-15 22:47:17
对于那些正在寻找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" />https://stackoverflow.com/questions/1804390
复制相似问题