首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET -使浏览器缓存无效

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

Stack Overflow用户
提问于 2009-11-26 23:39:42
回答 2查看 1.8K关注 0票数 5

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

例如:在当前版本中,css和一些图像发生了变化。在这种情况下,我希望在更新完成后,当用户对网站执行请求时,其浏览器的缓存将自动失效,从而强制重新下载新的图像和样式。应该只对客户端的第一个请求执行此操作...下面的代码应该从缓存中检索(所以设置no-cache杂注是不可能的)。

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

这将在响应头中设置ETag。我认为,如果我在每次发布时更改此ETag,并在每次请求时设置它,缓存将无效,但似乎并非如此。我使用Live HTTP头来查看结果,ETAG已为响应正确设置,但css和图像仍然是从缓存中获取的……

有没有什么想法可以让我做到这一点,或者我能不能做到?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-27 00:06:00

我在过去遇到过这样的问题。不幸的是,我找不到一个很好的方法来完成这个任务,所以我不得不想出一个变通的办法。我只处理CSS文件的这个问题,所以我为每个CSS引用添加了一个额外的querystring参数,例如

代码语言:javascript
复制
 <link rel="stylesheet" type="text/css" 
       href="default.css?buildnumber=<%= Buildnumber %>" />

每个版本的内部版本号都会递增,所以浏览器不得不去寻找这个新文件。这不是一个理想的解决方案,但它工作得很顺利。

票数 5
EN

Stack Overflow用户

发布于 2021-01-15 22:47:17

对于那些正在寻找MVC5解决方案的人:

Step1:将项目的AssemblyInfo.cs文件更改为

代码语言:javascript
复制
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

步骤2:创建一个类来获取项目的当前版本信息:

代码语言:javascript
复制
     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:在视图中调用需要在新构建时自动刷新缓存的类方法。

代码语言:javascript
复制
    @{
    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文件中

代码语言:javascript
复制
 <script src="~/js/index.js?v=@_ver"></script>
 <link href="/css/style.css?v=@_ver" rel="stylesheet" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1804390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档