6

我有一个与缓存失效技术有关的问题...我正在尝试为我的网站实现一种机制,该机制会自动使浏览器缓存(css、图像...)无效。每当我更新网站(更改图像或样式)时,我希望能够以编程方式使浏览器缓存无效;

例如:对于当前版本,其中的 css 和一些图像已经改变。在这种情况下,我希望在更新完成后,当用户向网站执行请求时,他的浏览器缓存自动失效,从而强制重新下载新的图像和样式。这应该只针对客户端的第一个请求进行......应该从缓存中检索以下请求(因此设置 no-cache pragma 是不可能的)。

这是我尝试过的:在 BeginRequest 事件处理程序中,我添加了以下几行:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
Response.Cache.SetETag("\"e111293b17594f1487d136ea7e9314ac\"");

这会在响应标头中设置 ETag。我想如果我在每个版本中更改这个 ETag,并在每个请求中设置它,缓存就会失效,但似乎不是。我使用 Live HTTP 标头查看结果,并为响应正确设置了 ETAG,但 css 和图像仍然从缓存中获取。

关于我如何实现这一点的任何想法,或者它是否可以实现?

4

2 回答 2

6

我过去遇到过这样的问题。不幸的是,我找不到一个非常好的方法来实现这一点,所以我不得不想出一个解决方法。我只处理 CSS 文件的这个问题,所以我为每个 CSS 引用添加了一个额外的查询字符串参数,例如

 <link rel="stylesheet" type="text/css" 
       href="default.css?buildnumber=<%= Buildnumber %>" />

每个版本都会增加内部版本号,因此浏览器被迫去寻找这个新文件。不是一个理想的解决方案,但它工作顺利。

于 2009-11-26T16:05:59.750 回答
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" />
于 2021-01-15T14:47:16.930 回答