使Silverlight XAP文件以编程方式从浏览器缓存过期

时间:2010-02-17 15:28:13

标签: silverlight browser caching xap

如何阻止Web浏览器缓存Silverlight XAP文件?

我想这样做的原因是在开发期间我不想手动清除浏览器缓存,我正在寻找程序化方法服务器端。

7 个答案:

答案 0 :(得分:26)

使用IIS管理添加值为Cache-Control的自定义标头no-cache。这将导致浏览器在使用之前检查XAP的任何缓存版本是否为最新版本。

答案 1 :(得分:8)

在HTML页面的元素中为XAP的URL添加查询参数:

  • 的ClientBin / MyApp.xap?转= 1
  • 的ClientBin / MyApp.xap?转= 2

它将被忽略并打破缓存。 在IE8中,有一些缓存管理工具: 打开开发人员工具:

  • 尝试缓存...始终从服务器刷新
  • 尝试缓存...清除此域的浏览器缓存...

答案 2 :(得分:6)

提供的解决方案here与迈克尔有点类似,但是是自动的,并保证客户端总是会获得新版本。根据您的具体情况,此可能效率低下。

自从Lars在他的comments that he is not on Stack Overflow中说,我在这里复制了回复。

<object id="Xaml1" data="data:application/x-silverlight-2,
    "type="application/x-silverlight-2" width="100%" height="100%">

  <%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%>

  <%     
    string orgSourceValue = @"ClientBin/SilverlightApp.xap";     
    string param;

    if (System.Diagnostics.Debugger.IsAttached)     
    {
        param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />";
    }
    else     
    {     
      string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue;

      DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);      

      param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore=" +
                xapCreationDate.ToString() + "\" />";     
    }

    Response.Write(param);     
  %>

  ....

</object>

答案 3 :(得分:5)

创建一个自定义http处理程序来处理* .xap文件,然后在处理程序中设置缓存选项。

像这样......

using System;
using System.IO;
using System.Web;

public class FileCacheHandler : IHttpHandler
{
    public virtual void ProcessRequest(HttpContext context)
    {
        if (File.Exists(context.Request.PhysicalPath))
        {
            DateTime lastWriteTime = File.GetLastWriteTime(filePath);
            DateTime? modifiedSinceHeader = GetModifiedSinceHeader(context.Request);

            if (modifiedSinceHeader == null || lastWriteTime > modifiedSinceHeader)
            {
                context.Response.AddFileDependency(filePath);
                context.Response.Cache.SetLastModifiedFromFileDependencies();
                context.Response.Cache.SetCacheability(HttpCacheability.Public);
                context.Response.TransmitFile(filePath);
                context.Response.StatusCode = 200;
                context.Response.ContentType = "application/x-silverlight-app";
                context.Response.OutputStream.Flush();
            }
            else
            {
                context.Response.StatusCode = 304;
            }
        }
    }

    public DateTime? GetModifiedSinceHeader(HttpRequest request)
    {
        string modifiedSinceHeader = request.Headers["If-Modified-Since"];
        DateTime modifiedSince;
        if (string.IsNullOrEmpty(modifiedSinceHeader)
          || modifiedSinceHeader.Length == 0
          || !DateTime.TryParse(modifiedSinceHeader, out modifiedSince))
            return null;

        return modifiedSince;
    }
}

答案 4 :(得分:5)

我在xap文件的路径中添加了一个查询参数,以便我可以通过版本控制来管理它。

Default.aspx 代码:

<param
   name="source"
   value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" />

Default.aspx.cs 代码:

protected string XapID
{
    get
    {
        Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

        if (System.Diagnostics.Debugger.IsAttached)
            Response.Write(string.Format("Build: {0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()));
        return string.Format("{0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()
    }
}

答案 5 :(得分:2)

以上所有示例都取决于浏览器不缓存包含新技巧xap名称的HTML ....所以你只需将问题转移到其他地方。 而且他们也非常复杂......

但是对于调试案例,至少可以很容易地编写&lt; object&gt;和&lt; param&gt; javascript中的标签,以便每次使用html页面时名称都会更改,无论是否由浏览器缓存!

<script type="text/javascript">
   document.write('<object blah blah >');
   document.write('<param name="Source" value="myapp.xap?'
               + new Date().getTime()+'">');
   document.write('</object>'); 
</script>

这可以避免您控制服务器设置的任何麻烦,并且无论使用何种服务器技术,都可以正常工作。

注意:您必须使用相同的方法编写整个对象组,因为在对象标记内放置一个脚本标记意味着“只有在浏览器不支持该对象时才执行此操作。”

答案 6 :(得分:2)

进入.XAP缓存并不是很常见,这意味着每次部署新版本的Silverlight应用程序时,浏览器都不会下载更新的.XAP文件。

一种解决方案可能是更改IIS属性。您可以按照以下步骤为.XAP文件启用“启用内容过期HTTP标头”选项:

  1. 打开IIS管理器
  2. 转到“默认网站”,找到Silverlight项目的网站。
  3. 在ClientBin下找到.XAP文件。
  4. 转到.XAP文件的属性页,在“HTTP标头”选项卡上,启用“启用内容过期”,单击“立即过期”单选按钮。
  5. 保存更改。
  6. 这样,当您刷新页面而不必关闭浏览器时,将下载最新的.XAP(仅当有最新的.XAP文件时)。

    希望这有帮助!