http - ASP.NET : How to enforce a reload of a web static file

标签 http caching http-caching

在处理网页时,客户端/浏览器决定是更新图像、.css 或 .js 等文件,还是从缓存中获取文件。

对于 .aspx 页面,由服务器决定。

当然,在 IIS 级别或也使用一些 HttpModule 技术,我可以更改请求的 header 以告诉客户端文件是否应该缓存以及缓存多长时间。

现在,我确实有一个网站,其中 .aspx 与相应的 .js 齐头并进。所以,也许我在 .js 中有一些 jQuery 代码可以访问 .aspx 中的元素。如果我从 .aspx 中删除该元素,我也会调整 .js。如果用户访问我的页面,他将获得新的 .aspx,但他可能仍会获得旧的 .js,从而导致有趣的效果。

我的网站使用了大量的脚本和图像。出于性能原因,我在 IIS 中配置了这些文件“永不”过期。

现在,文件确实会不时更改,我想确保用户获得更新文件。

一开始我通过重命名文件来帮助自己。所以,我有 SkriptV1.js 和 SkriptV2.js 等等。这是最糟糕的选择,因为存储库历史记录已损坏,我需要调整引用和文件名。

现在,我在这里进行了改进,使用 Skript.js?v=1 或 Skript.js?v=2 仅更改引用。 这会强制客户端刷新文件。它工作正常,但我仍然必须调整引用资料。

现在,这里有一个进一步的改进:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>

因此,“GetScriptLastModified”将像这样附加 ?v= 参数:

protected string GetScriptLastModified(string FileName)
{
    string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
    return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}

因此,呈现的 .js-Link 对客户端来说看起来像这样:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>

链接每次都会更改,当我上传新版本时,我可以确保用户在更改时立即获得新的脚本或图像。

现在,两个问题: a) 是否有更优雅的方法来实现这一点? b) 如果不是:有人猜到服务器的性能开销有多大吗?一个页面上很容易有 50 个版本化元素,因此对于一个 .aspx,GetScriptLastModified 将被调用 50 次。

期待讨论:)

最佳答案

这个问题有几个不同的答案。

首先,如果您的文件只是偶尔更改一次,请将 Expires 和 Cache-Control header 设置为一年后过期。只有当文件真正永不过期时,您才应该说它们永不过期。您现在看到说“永不过期”的问题。

此外,如果您的站点因提供大量图像和 JavaScript 而出现性能问题,普遍接受的解决方案是使用 CDN(内容分发网络)。有许多不同的供应商,我相信您可以找到符合您预算的供应商。从长远来看,您还将节省资金,因为 CDN 将从 IIS 卸载大量 I/O 和 CPU 时间。它能产生如此巨大的变化,这令人震惊。

最后,确保用户获得几乎永远不会更改的最新文件的一种方法是在您的 Assets URL 中实现某种版本控制方案,以使缓存清除发生。有许多不同的方法可以做到这一点,但一种(非常幼稚的)方法是让版本号在您每次部署到您的站点时增加。

例如您所有的 Assets URL 都将类似于/static/123/img/dog_and_pony.jpg

然后,下次部署到您的站点时,增加版本号,使其变为“124”。您需要一些方法来跟踪版本,将其动态注入(inject) Assets URL,并确保每次部署时版本号都发生变化。这个想法是任何引用此 Assets 的东西都应该自动知道新版本号。

就性能而言,永远不需要用户刷新或必须下载同一内容两次是一个令人钦佩的目标。但有时只是麻烦少了很多,如果用户只是定期刷新所有内容,这对大多数网站来说可能没问题。

希望这对您有所帮助。

关于http - ASP.NET : How to enforce a reload of a web static file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3249693/

相关文章:

php - 从 PHP 缓存 header

支持 http 1.1 响应缓存的 C++ 库

http - ejabberd_http_auth 插件中的未知选项 'auth_opts' 问题

caching - 使用缓存存储 API 保存自定义响应

angular - ionic /Angular ,如何强制客户端在每次发布后清理浏览器缓存?

Swift 2 Parse 和 KingFisher 缓存图像

.net - 为什么我的 HTTP 缓存 header 不起作用?

ruby - 无法使用 Vagrant 转发端口访问主机上的 Sinatra 应用程序

Java 字符串 HTTP 编码

json - Flutter dart json未处理的异常: InternalLinkedHashMap<String,动态>' is not a subtype of type '列表<动态>