2008-11-19 16 views
8

Tengo una aplicación Flex con varios módulos.Prevención del almacenamiento en memoria caché de la aplicación Flex en el navegador (módulos múltiples)

Cuando volví a desplegar la aplicación, descubrí que los módulos (que se implementan como archivos swf separados) se almacenaban en caché en el navegador y las nuevas versiones no se cargaban.

Así que probé el antiguo truco de agregar ?version=xxx a todos los módulos cuando se cargan. El valor xxx es un parámetro global que se almacena en la página HTML anfitrión:

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

Además yo tenía que añadir a la ?version=xxx .swf principal que se está cargando. Dado que esto se hace mediante HTML que tenía que hacer esto modificando el archivo de la siguiente manera mis 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); 
} 

todo esto está bien y funciona muy bien. Simplemente me cuesta creer que Adobe todavía no tenga una forma de manejar esto. Dado que Flex está siendo diseñado para diseñar aplicaciones modulares para empresas, me resulta especialmente sorprendente.

¿Qué hacen otras personas? Necesito asegurarme de que mi aplicación vuelva a cargarse correctamente incluso si alguien tiene once per session seleccionado para su 'política de verificación de caché del navegador'.

Respuesta

0

El almacenamiento en caché no está hecho por Flash Player sino por el navegador, por lo que está fuera del control de Adobe. Creo que has encontrado una solución viable. Si deseo evitar el almacenamiento en caché, generalmente añado un número al azar en la URL.

+0

derecha, pero encontrar una solución viable isnt fuera de su control. principalmente quiero asegurarme de que no me falta una función incorporada y reinventar la rueda. Específicamente, no deseo un número aleatorio porque quiero que la aplicación se guarde en la memoria cuando sea posible. –

1

Lo que he hecho es la suma de comprobación del archivo SWF y luego lo agregué a su url. Permanece igual hasta que el archivo se reconstruye/redistribuye. Manejado automágicamente por unas pocas líneas de script PHP del lado del servidor

+0

suena interesante. me gusta el pensamiento de 'establecer y olvidar'. ¿Dónde está almacenando/almacenando en caché estas sumas de comprobación? no los está recalculando automágicamente con cada solicitud de página ¿verdad? –

+0

En mi aplicación, la página que contiene el archivo SWF se carga una vez (o poco frecuente - hago ajax y flexo remoting después de eso). Y entonces, calcular la suma de comprobación md5 en PHP al armar la página no es un gran problema. Mi SWF tiene un tamaño inferior a 120K, por lo que este trabajo se realiza bastante rápido. ... –

+0

..para los SWF de recursos mucho más grandes que también uso, pongo la suma de comprobación calculada en un archivo lateral que se escribe en el momento de la creación. Las respuestas de Ajax transmiten las URL de SWF etiquetadas con suma de comprobación al cliente según sea necesario. –

3

Tuve un problema similar, y terminé colocando los archivos SWF en un subdirectorio llamado como el número de compilación. Esto significaba que la URL de los archivos SWF apuntaba a una ubicación diferente cada vez.

Idealmente esto debería ser atendido por la plataforma, pero no hay alegría allí. Pero esto funciona perfectamente para nosotros, y se integra muy fácilmente en nuestras compilaciones automáticas con Hudson, no hay quejas hasta el momento.

1

aquí está la muestra.

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 es un archivo y existe html-template en varios lugares. pero como dijo mi publicación, me enfrento a otro tipo de problema.

Cuestiones relacionadas