2008-11-19 7 views
8

J'ai une application Flex avec plusieurs modules. Lorsque je redéployais l'application, je constatais que les modules (qui sont déployés en tant que fichiers SWF distincts) étaient mis en cache dans le navigateur et que les nouvelles versions n'étaient pas chargées.Prévention de la mise en cache de l'application Flex dans le navigateur (plusieurs modules)

J'ai donc essayé l'astuce d'ajouter ?version=xxx à tous les modules quand ils sont chargés. La valeur xxx est un paramètre global qui est stocké dans la page html hôte:

var moduleSection:ModuleLoaderSection; 
moduleSection = new ModuleLoaderSection(); 
moduleSection.visible = false; 
moduleSection.moduleName = moduleName + "?version=" + MySite.masterVersion; 

En plus je devais ajouter ?version=xxx la principale .swf qui était en cours de chargement. Étant donné que cela se fait par HTML que je devais le faire en modifiant mon dossier AC_OETags.js comme ci-dessous:

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); 
} 

Tout cela est bien et fonctionne très bien. J'ai juste du mal à croire qu'Adobe ne dispose pas d'un moyen de gérer cela. Étant donné que Flex vise à concevoir des applications modulaires pour les entreprises, je trouve cela particulièrement surprenant.

Que font les autres? Je dois m'assurer que mon application se recharge correctement même si quelqu'un a once per session sélectionné pour sa 'politique de vérification du cache du navigateur'.

Répondre

0

La mise en cache n'est pas effectuée par Flash Player mais par le navigateur, donc hors du contrôle d'Adobe. Je pense que vous avez trouvé une solution viable. Si je veux éviter la mise en cache, j'ajoute généralement un nombre aléatoire sur l'URL.

+0

droit, mais trouver une solution viable isnt hors de leur contrôle. Je veux avant tout m'assurer que je ne manque pas de fonctionnalité intégrée et que je réinvente la roue. Je ne veux pas spécifiquement un nombre aléatoire parce que je veux que l'application soit mise en cache lorsque possible –

1

Ce que j'ai fait est checksum le fichier SWF, puis l'ajouter à son URL. Reste le même jusqu'à ce que le fichier soit reconstruit/redéployé. Manipulé automagiquement par quelques lignes de script PHP côté serveur

+0

semble intéressant. J'aime la pensée 'set and forget'. où stockez-vous/cachez-vous ces sommes de contrôle? vous ne les recalculez pas automagiquement à chaque demande de page êtes-vous? –

+0

Dans mon application, la page contenant le fichier SWF est chargée une fois (ou verrry rarement - je fais ajax & flex remoting après cela). Calculer la somme de contrôle md5 en PHP lors de l'assemblage de la page n'est donc pas un gros problème. Mon SWF a une taille inférieure à 120K donc ce travail est fait assez rapidement. ... –

+0

..Pour les fichiers SWF de ressources beaucoup plus importants que j'utilise également, je place la somme de contrôle calculée dans un fichier latéral écrit au moment de la création. Les réponses Ajax transmettent des urls SWF étiquetées par checksum au client selon les besoins. –

3

J'ai rencontré un problème similaire et j'ai fini par mettre les fichiers SWF dans un sous-répertoire nommé numéro de build. Cela signifiait que l'URL des fichiers SWF pointait vers un emplacement différent à chaque fois.

Idéalement, cela devrait être pris en charge par la plate-forme, mais pas de joie là-bas. Mais cela fonctionne parfaitement pour nous, et s'intègre très facilement dans nos constructions automatisées avec Hudson - aucune plainte jusqu'à présent.

1

voici un exemple.

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 est un fichier et existe html-template plusieurs endroits. mais comme je l'ai dit, je suis confronté à un autre type de problème.

Questions connexes