我有一个包含多个模块的Flex应用程序。
当我重新部署应用程序时,我发现模块(部署为单独的swf文件)被缓存在浏览器中,并且没有加载新版本。
所以我尝试了在加载时为所有模块添加?version=xxx
的古老技巧。值xxx
是一个全局参数,实际存储在主机html页面中:
var moduleSection:ModuleLoaderSection;
moduleSection = new ModuleLoaderSection();
moduleSection.visible = false;
moduleSection.moduleName = moduleName + "?version=" + MySite.masterVersion;
此外,我需要将?version=xxx
添加到正在加载的主.swf中。由于这是由HTML完成的,我必须通过修改我的AC_OETags.js文件来执行此操作,如下所示:
function AC_FL_RunContent(){
var ret =
AC_GetArgs
( arguments, ".swf?mv=" + getMasterVersion(), "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
, "application/x-shockwave-flash"
);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
这一切都很好,效果很好。我很难相信Adobe还没有办法解决这个问题。鉴于Flex的目标是为业务设计模块化应用程序,我发现它特别令人惊讶。
其他人做什么?即使有人为其“浏览器缓存检查策略”选择了once per session
,我也需要确保我的应用程序正确重新加载。
答案 0 :(得分:3)
我遇到了类似的问题,最后将SWF文件放在一个名为内部版本号的子目录中。这意味着每次SWF文件的URL指向不同的位置。
理想情况下,这应该由平台照顾,但没有欢乐。但这对我们来说非常有效,并且可以很容易地与Hudson集成到我们的自动构建中 - 到目前为止没有任何抱怨。
答案 1 :(得分:2)
答案 2 :(得分:1)
我所做的是校验和SWF文件,然后将其添加到其URL。在重建/重新部署文件之前保持不变。通过几行服务器端PHP脚本自动处理
答案 3 :(得分:1)
这里是样本。
function AC_FL_RunContent(){
var ret = AC_GetArgs(arguments, ".swf?ts=" + getTS(), "movie",
"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",
"application/x-shockwave-flash");
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function getTS() {
var ts = new Date().getTime();
return ts;
}
AC_OETags.js是文件,它存在几个地方的html-template。 但正如我的帖子所说,我正面临另一种问题。
答案 4 :(得分:0)
缓存不是由Flash Player完成的,而是由浏览器完成的,因此它不受Adobe的控制。我认为你找到了一个可行的解决方案。如果我想避免缓存,我通常会在URL上附加一个随机数。