2011-05-13 20 views
7

Estoy tratando de averiguar cómo forzar al navegador a volver a descargar un archivo .xap si la nueva versión está disponible y, sin embargo, la anterior aún está en la memoria caché del navegador .Cómo forzar la nueva descarga del archivo Silverlight XAP

he visto el otro hilo: How do you force Firefox to not cache or re-download a Silverlight XAP file?

La mejor solución parece ser:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
    this.myApp.Source += "?" + versionNumber; 
} 

Sin embargo, no se deje la parte this.myApp. ¿Qué clase de objeto es ese? Lamento reabrir esto, pero me gustaría que la gente publicara soluciones completas.

Gracias

Respuesta

8

Lo que está viendo es código basado en el control del servidor web asp:Silverlight, pero ese control se suspendió de Silverlight 3 en adelante.

Ahora bien, utilizamos la etiqueta de objeto directamente o knock up nuestros propios controles de servidor para representar nuestra preferencia de etiqueta de objeto.

Como una etiqueta de objeto se vería algo como esto: -

<form id="form1" runat="server" style="height:100%"> 
<div id="silverlightControlHost"> 
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
     <param id="xapSource" runat="server" name="source" value="ClientBin/SilverlightApplication1.xap"/> 
     <param name="onError" value="onSilverlightError" /> 
     <param name="background" value="white" /> 
     <param name="minRuntimeVersion" value="4.0.50303.0" /> 
     <param name="autoUpgrade" value="true" /> 
     <param name="initParams" id="initParams" runat="server" /> 
     <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50303.0" style="text-decoration:none"> 
      <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/> 
     </a> 
    </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div> 
</form> 

Nota el ello y runat = "servidor" en el parámetro fuente. Con esto en lugar de la carga de la página podría ser algo como esto: -

protected void Page_Load(object sender, EventArgs e) 
{ 
    string xapPhysicalPath = Server.MapPath(xapSource.Attributes["value"]); 
    DateTime lastWrite = System.IO.File.GetLastWriteTime(xapPhysicalPath); 
    xapSource.Attributes["value"] = xapSource.Attributes["value"] + "?" + lastWrite.ToString("yyyyMMddThh:mm:ss"); 

} 

Esto aseguraría la URL utilizada para la fuente cambiaría siempre cuando el XAP ha cambiado. El código original con el que se ha cruzado es defectuoso, ya que aún es posible que el cambio varíe sin que cambie el número de versión del ensamblaje totalmente desconectado.

+0

No puedo acceder al objeto "param" ("xapSource" en su ejemplo) en código subyacente, intellisense no lo ve en absoluto. ¿Estoy haciendo algo mal? ¿Cómo se supone que debe verse en el archivo designer.cs? ¿Cuál es su tipo exacto? –

+0

Muy bien, lo tengo para trabajar. Param no puede ser alcanzado programáticamente, es necesario utilizar esta solución: http://geekswithblogs.net/mbcrump/archive/2011/01/06/prevent-your-silverlight-xap-file-from-caching-in-your -browser.aspx –

+0

Sí, estás haciendo algo mal. Debería verse como 'protected global :: System.Web.UI.HtmlControls.HtmlGenericControl xapSource;'. El tipo exacto es 'System.Web.UI.HtmlControls.HtmlGenericControl'. – AnthonyWJones

0

El myApp es probablemente un control de la tela que hace el objeto de Silverlight en la página.

Al establecer su propiedad de origen, la url que apunta a XAP obtiene un parámetro que es diferente de la versión anterior, haciendo que el navegador invalide el xap en caché (que tenía otro valor establecido para este parámetro).

+0

Técnicamente no se produciría la invalidación de la memoria caché, el navegador nunca había visto esa url antes y, por lo tanto, no la encontraría en la memoria caché. – AnthonyWJones

+0

Es cierto. gracias por la corrección. –

1

Puede agregar el datetime actual al xap y se verá como nuevo cada vez, por lo que no se almacenará el caché en el cliente.

value="ClientBin/SilverlightApplication1.xap?<%=DateTime.Now%>" 

Espero que esto ayude.

Cuestiones relacionadas