ASP.NET - 使浏览器缓存无效

时间:2009-11-26 15:39:42

标签: asp.net caching invalidation

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

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

这是我尝试过的: 在BeginRequest事件处理程序中,我添加了以下行:         Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);     Response.Cache.SetETag( “\” e111293b17594f1487d136ea7e9314ac \ “”);

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

关于如何实现这一目标的任何想法,或者它是否可以完成?

提前致谢!

2 个答案:

答案 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" />