0

我看过这个问题,我必须说它不适合我目前的问题/审讯。

设想:

用户成功登录(通过 Ajax 调用)后,他们被重定向(document.location.href)到 /app,基本 HTML 与 CSS 和 JS 文件一起发送到该处。

问题:

我目前将版本号放在我缩小的 javascript 和 css 文件名上,例如 appname-2.3.3.js 并添加了一个查询字符串版本号以确保它在新版本上得到刷新:

<script src="/js/app/appname-2.3.3-min.js?1207040740" language="javascript" type="text/javascript"></script>

当我推送新版本时,在新登录后,即使文件名和查询字符串数字发生变化,浏览器也会缓存最后一个版本。用户需要进行整页刷新 CTRL+F5 来获取新的静态文件。

问题:

a) 确保每个新登录用户都有正确版本的最佳方法是什么?我的猜测是 /app HTML 页面是缓存的,也许我需要在登录后重定向时将查询字符串值放在那里。但这给我带来了一个问题,即调用登录方法的 javascript 文件必须是“正确的”版本等,等等。

我应该在我的控制器中指定一个 HTTP 标头来告诉浏览器不要缓存 /app 页面吗?这是否意味着没有从该页面缓存静态文件?

几乎每周左右都有新的更新,仍然需要缓存。

b) 从您的角度来看,提醒已登录用户新版本已更新并且他们应该刷新页面的良好用户体验方式是什么?从用户的角度来看,它是“可接受的”吗?

作为参考,该应用程序基于 ASP.NET MVC 3 构建。

感谢您的时间/投入

4

1 回答 1

1

您可以使用它window.applicationCache来执行此操作。大多数人从问题的另一面想到应用程序缓存:如何在客户端缓存数据?但是当缓存清单文件更改时,它会更新该CACHE部分中的所有文件,完全忽略任何服务器缓存。您还将获得客户端缓存的好处。

这样就不需要版本号和查询字符串来试图说服您的浏览器刷新。

添加manifest="cache.manifest"<html>. cache.manifest是您将用于定义缓存内容的文件的名称。它可以命名任何东西,但我实际上叫 mine cache.manifest

<html lang="en" manifest="cache.manifest">

然后确保您的 Web 服务器的 MIME 类型.manifest设置为:

文本/缓存清单

然后创建一个名为 的文件cache.manifest,将其放在您的应用程序根目录中。在该CACHE部分下,放置您要缓存的文件(或者在这种情况下,刷新)。在该NETWORK部分下放置您不想缓存的任何文件,或者只是*用于“其他所有内容”。

每次推送版本时,请更改缓存清单中的版本号。文件中的任何更改都将起作用,但版本号是一个完美的机制。

CACHE MANIFEST
#ver 1.0.0

CACHE:
app.html
app.css
app.js

NETWORK:
*

然后把它放在你的onload或同等的脚本的顶部。请注意,当您第一次将其添加到代码中时,刷新不会在第一次更新时发生(因为此功能不可用),而是在第二次更新时发生。初始更新后,它将按预期工作。

function updateVersion( event ) {

    window.applicationCache.removeEventListener( 'updateready', updateVersion, false );

    if ( window.applicationCache.status == window.applicationCache.UPDATEREADY ) {
        //perhaps notify user here
        window.applicationCache.swapCache();
        window.location.reload();
    };

};

if ( window.applicationCache ) { 
    window.applicationCache.addEventListener( 'updateready', updateVersion, false ); 
};
于 2012-07-05T09:36:36.673 回答