2010-02-17 41 views

回答

26

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

+0

这是一个很好的回应,比很多其他人都好(我已经看到你在这里多次给出这个答案。)我是网络开发新手,但在阅读下面的教程后,我可以看到这正是是XAP缓存所必需的。这确实是一个很好的解决方案。 [缓存教程](http://www.mnot.net/cache_docs/) –

+0

这不会强制浏览器永不缓存XAP?还是它确保它只在XAP相同时才缓存? –

+0

有没有办法通过Web.Config来做到这一点?我的项目托管在服务器上,我无法访问IIS管理。 – Marlon

7

在元件添加的查询参数的URL XAP上的HTML页:?

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

它会被忽略,并且打破了缓存。 在IE8中,也有一些缓存的管理工具: 打开开发工具:

  • 尝试缓存...从服务器总是刷新
  • 尝试缓存清空浏览器缓存,该域...
+0

当引用它们的URL是动态生成的,因此可以添加这些引用时,静态资源上的修订号可能非常有效。然而,需要相当多的定制基础设施来动态实现这一点,而开发人员不得不记得手动升级版本号。如果资源在多个地方使用,情况会变得更糟。由于XAP不可能以高频率从个人客户那里请求,所以偶尔的“未修改”响应更为合意。 – AnthonyWJones

5

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

事情是这样的......

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

的解决方案呈现here有点类似于迈克尔的,但是是自动的,保证了客户总是会得到一个新的版本。根据您的情况,此可能效率低下。

由于拉斯说,在他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> 
+0

我给了这个方法一个去,虽然我可以调试并看到正确构建的'参数',Response.Write写在我的例子标签的开始上面。任何想法如何解决这一个? – dougajmcdonald

+0

呃......那很奇怪。也许你可以Response.Write整个对象标签,包括参数? – Jedidja

+0

确实很奇怪,我想把所有的东西都写出来,这是我做的。似乎有一个我们正在使用的框架,它不处理它们在aspx/Response流中的位置处的response.writes。会向他们打电话,看他们是否能指出我的写作方向。感谢您的回应 – dougajmcdonald

2

那么上述所有例子依赖于不缓存包含新把戏XAP名的HTML浏览器....所以你只需动的问题到别的东西。 而且他们也恶魔般的复杂....

然而,对于调试情况下,至少,它很容易编写<对象>和<PARAM> 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> 

这回避你可能有控制服务器设置和使用的作品一样好,无论服务器技术的任何麻烦。

注意:您必须编写整个对象组用同样的方法,因为把一个脚本标记物标记中意思是“只有这样做,如果浏览器犯规支持对象

5

我添加了一个查询PARM到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() 
    } 
} 
2

这不是很罕见碰上.XAP缓存,这意味着每次您部署新版本的Silverlight应用程序,浏览器不会下载更新的.XAP文件。

一个解决方案可能是更改IIS属性。您可以通过以下步骤打开你的.xap文件“启用内容过期的HTTP标头”选项:

  1. 打开IIS管理器
  2. 进入“默认Web站点”,找到网站,为您的Silverlight项目。
  3. 找到ClientBin下的.XAP文件。
  4. 转到.XAP文件的属性页,在HTTP Headers选项卡上,打开“启用内容过期”,单击“立即过期”单选按钮。
  5. 保存更改。

这样,当你刷新页面,而无需关闭浏览器的最新.XAP(仅当有一个最新的.xap文件)将得到下载。

希望这会有所帮助!

相关问题