2011-05-06 14 views
21

Desarrollé una aplicación de navegador XAML (XBAP) que está incrustada dentro de una página web de ASP.NET. Tengo problemas para actualizar la versión más reciente de XBAP en la computadora del cliente. Durante el desarrollo, tuve que usar la herramienta Mage.exe para borrar el caché de la aplicación para que mis cambios se vean al ejecutar en mi computadora local. Además de ejecutar Mage.exe -cc en la línea de comandos, también he encontrado que rundll32 dfshim CleanOnlineAppCache funciona igual de bien.¿Cómo actualizar XBAP a la última versión en la computadora del cliente?

Sin embargo, no deseo pedirles a los clientes que ejecuten ningún comando en la línea de comandos. ¿Qué tendré que hacer para que el XBAP se actualice automáticamente en la computadora del cliente? En lugar de la actualización actualizada de XBAP en la computadora cliente, la versión anterior de XBAP continúa ejecutándose.

actualización

creé una recompensa por esta pregunta porque tengo el mismo problema. Según lo que leí en línea, se supone que los XBAP deben comparar la versión en caché # con la versión # del que está en el servidor web, y descargar la nueva versión si es diferente. He verificado que mis números de versión son diferentes, pero la copia en caché sigue siendo la que se está ejecutando cuando ejecuto XBAP.

La copia en caché también aparece si ejecuto el XBAP fuera de la página asp.net, aunque obtengo la nueva versión si cambio los parámetros de la url.

Actualización # 2

he descubierto que el XBAP no se actualiza automáticamente en XP máquinas de 32 bits, pero no en mi máquina de Windows 7 de 64 bits.

Respuesta

3

Usted podría intentar algo como esto, aunque lo uso en XAPs no XBAP que podría funcionar para usted también:

(fragmento sigue)

public partial class App : Application 
{ 
    /// <summary> 
    /// Creates a new <see cref="App"/> instance. 
    /// </summary> 
    public App() 
    { 
     Application.Current.CheckAndDownloadUpdateAsync(); 
     // rest of code 

EDITAR

iba a sugieren incrementar el número de versión entre las publicaciones, pero parece que ya se ha solucionado. ¿Este comportamiento ocurre en todos los navegadores? Puede ser un error/rareza específico de IE (he visto muchos errores de IE ... no me sorprendería)

+1

Ese método no parece existir en un XBAP – Rachel

+0

Probé con IE, FireFox y Chrome, y todos ellos no pueden descargar la nueva versión. – Rachel

+1

[CheckAndDownloadUpdateAsync] (http://msdn.microsoft.com/en-us/library/system.windows.application.checkanddownloadupdateasync (v = vs.95) .aspx) parece ser una función exclusiva de Silverlight, no WPF/XBAP. –

0

sin los encabezados de caché correctos que su navegador puede estar impidiendo la descarga de xbap.

borra el caché para ver si esto lo soluciona.

Alternativamente, puede utilizar:

<%string versionInfo = typeof (AVSTX.POS.WebMvc.Controllers.HomeController).Assembly.GetName().Version.ToString(); %> 
<param name="source" value="<%=ResolveUrl("~/ClientBin/AVSTX.POS.WebRia.xap?version=" + versionInfo) %>"/> 

para crear una nueva dirección URL, que el navegador no puede almacenar en caché en este punto. Se basa en la inspección de la versión de ensamblado de acogida así que asegúrese de incrementar [assembly: AssemblyVersion ("3.4.9.0")] [assembly: AssemblyFileVersion ("3.4.9.0")]

esta solución no lo hará resuelva los módulos dinámicos que puede descargar en el futuro. Deberá corregir los encabezados de caché reales si este es su problema.

edición 1: código para desactivar la memoria caché del navegador

//http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache 
//http://developer.yahoo.com/performance/rules.html#expires 
//http://ray.jez.net/prevent-client-side-caching-with-httpmodules/ 
//http://stackoverflow.com/questions/2281919/expiry-silverlight-xap-file-from-browser-cache-programmatically 
public class XapFileHttpModule : IHttpModule 
{ 
    #region IHttpModule Members 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += context_BeginRequest; 
    } 

    public void Dispose() 
    { 
    } 

    private void context_BeginRequest(Object source, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)source; 
     HttpContext context = application.Context; 

     if(context.Request.FilePath.Contains(".xap")) 
     { 
      context.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
      context.Response.Cache.SetValidUntilExpires(false); 
      context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
      context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      context.Response.Cache.SetNoStore(); 
     } 
    } 

    #endregion 
} 
+0

¿Esto no volverá a descargar la aplicación cada vez que se ejecute? El objetivo de almacenar en caché es no volver a descargar, lo cual me gusta porque hace que el tiempo de inicio sea más rápido. – Rachel

+0

solo en versiones nuevas se volverá a descargar. La url creada se basa en el sitio web del host AssemblyVersion (lo mantengo igual que la aplicación que usa archivos vinculados). Entonces el almacenamiento en caché todavía funciona. Si descarga dinámicamente conjuntos nuevos, es posible que aún tenga los mismos problemas de almacenamiento en caché que se pueden resolver con http://compositewpf.codeplex.com/discussions/240811?ProjectName=compositewpf –

+0

¿Sabe cómo implementar esto en un XBAP? (¿o si es posible?) El código y el enlace que publicó parecen ser solo para Silverlight. – Rachel

0

Puede utilizar ClickOnce para implementar la aplicación. Si desea obligar al usuario a actualizar, simplemente configure la versión mínima requerida para la aplicación (está en el cuadro de diálogo Actualizaciones de la aplicación).

+0

Quiero mantener la aplicación incrustada en el sitio web, y ClickOnce la ejecutará fuera del sitio. Además, el tiempo de carga de las aplicaciones ClickOnce es más de lo que prefiero. – Rachel

0

El almacenamiento en caché de aplicaciones se realiza a través del almacenamiento en memoria caché de los archivos de manifiesto, cuando se modifican las firmas, el tiempo de ejecución actualizará los archivos locales (además, simplemente actualizará los archivos modificados). Solo asegúrese de que tiene los encabezados correctos enviados en las respuestas HTTP. A veces, las configuraciones de caché de páginas dinámicas o la configuración global de los proveedores de alojamiento interfieren. Para mí, siempre funciona de la caja.

0

ClickOnce funcionó para mí como un encanto. También asegúrese de estar versionando su XBAP de forma adecuada.

2

Hace años, tuvimos este problema con un sitio web normal. Nos perseguía y, al final, terminamos cambiando el prefijo url para cada nueva versión. La primera página nunca se almacenó en caché y se reenvió a la url actualizada.

Es una solución, lo sé, pero muy confiable.

0

Despliegue mi Xbap simplemente copiando archivos en el directorio ClientBin en mi proyecto web. Lo visualizo en iframe. Para hacer que la aplicación "actualice" la versión, tengo que cambiar "Publicar versión" en el proyecto Xbap antes de compilar. Propiedades del proyecto -> Publicar -> Publicar versión.

Esto cambia la versión en xbap y el archivo de manifiesto obligando a los clientes a descargar la versión más reciente.

Cuestiones relacionadas