【问题标题】:How to update XBAP to latest version on client computer?如何在客户端计算机上将 XBAP 更新到最新版本?
【发布时间】:2011-08-20 05:47:14
【问题描述】:

我开发了一个嵌入在 ASP.NET 网页中的 XAML 浏览器应用程序 (XBAP)。在客户端计算机上更新最新版本的 XBAP 时遇到问题。在开发过程中,我不得不使用 Mage.exe 工具来清除应用程序缓存,以便在本地计算机上运行时可以看到我的更改。除了在命令行中执行Mage.exe -cc,我还发现rundll32 dfshim CleanOnlineAppCache 也能正常工作。

但是,我不想要求客户在命令行中运行任何命令。我需要做什么才能使客户端计算机上的 XBAP 自动更新?不是在客户端计算机上刷新更新的 XBAP,而是继续运行以前版本的 XBAP。

更新

我在这个问题上创建了一个赏金,因为我有同样的问题。根据我在网上阅读的内容,XBAP 应该将缓存的版本 # 与网络服务器上的版本 # 进行比较,如果不同,则下载新版本。我已验证我的版本号不同,但缓存的副本仍然是我启动 XBAP 时正在运行的副本。

如果我在 asp.net 页面之外启动 XBAP,缓存的副本也会出现,但如果我更改 url 参数,我会得到新版本。

更新 #2

我发现 XBAP 确实在 XP 32 位机器上自动更新,但在我的 Windows 7 64 位机器上却没有。

【问题讨论】:

    标签: c# asp.net wpf xbap


    【解决方案1】:

    您可以尝试这样的方法,虽然我在 XAP 而非 XBAP 中使用它,但它也可能对您有用:

    (sn-p 跟随)

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

    编辑

    本来会建议在发布之间增加版本号,但似乎已经解决了。这种行为是否发生在所有浏览器上?可能是一些特定于 IE 的错误/怪异(我已经看到很多仅 IE 的不当行为......我不会感到惊讶)

    【讨论】:

    • XBAP 中似乎不存在该方法
    • 我用IE、FireFox、Chrome测试过,都下载不了新版本。
    • CheckAndDownloadUpdateAsync 似乎是 Silverlight 独有的功能,而不是 WPF/XBAP。
    • 对于 WPF;将上述代码替换为 new System.Deployment.Application.DeploymentServiceCom().CleanOnlineAppCache(); - 由stackoverflow.com/questions/11774838/… 提供
    【解决方案2】:

    几年前,我们在一个普通的网站上遇到了这个问题。它一直困扰着我们,最后,我们最终更改了每个新版本的 url 前缀。第一个页面从未被缓存,并转发到更新的 url。

    我知道这是一种解决方法,但非常可靠。

    【讨论】:

      【解决方案3】:

      您可以使用ClickOnce 来部署您的应用程序。如果您想强制用户更新,只需设置应用程序所需的最低版本(它在应用程序更新对话框中)。

      【讨论】:

      • 我想将应用程序嵌入到网站中,ClickOnce 会让它在网站外运行。此外,ClickOnce 应用程序的加载时间比我更喜欢。
      【解决方案4】:

      如果没有正确的缓存标头,您的浏览器可能会阻止下载 xbap。

      清除缓存以查看是否可以解决问题。

      替代使用:

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

      创建一个浏览器此时无法缓存的新 url。 它基于检查主机程序集版本,因此请确保增加 [组装:组装版本(“3.4.9.0”)] [程序集:AssemblyFileVersion("3.4.9.0")]

      此解决方案不会解决您将来可能下载的动态模块。如果这是您的问题,您将需要修复实际的缓存标头。

      编辑 1:禁用浏览器缓存的代码

          //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
      }
      

      【讨论】:

      • 这不会在应用程序运行时重新下载吗?缓存它的全部意义在于它不会重新下载,我喜欢它,因为它使启动时间更快。
      • 只有在新版本上才会重新下载。创建的 url 基于主机网站 AssemblyVersion(我将其与使用链接文件的应用程序保持一致)。所以缓存仍然有效。如果您动态下载新程序集,您可能仍会遇到相同的缓存问题,可以使用 compositewpf.codeplex.com/discussions/… 解决
      • 你知道如何在 XBAP 中实现它吗? (或者如果有可能?)您发布的代码和链接看起来都只适用于 Silverlight。
      • 该链接并非特定于 sl,它更特定于 prism 基础架构以及您如何按需管理组件。实际上,我的积压工作中有这个要实施,但没有时间。我目前永久禁用缓存,直到我构建加载器。我宁愿下载速度慢而不是应用程序损坏。我添加了我为禁用 .xap 缓存而构建的 httpmodule .. 您可以为正在缓存且未更新的文件添加扩展名。 (添加到原始评论中)
      • 我仍然不清楚如何在 XBAP 中实现这一点,XBAP 是在 Web 浏览器中运行的 WPF 应用程序,而不是 Silverlight 应用程序。我不使用 MVC 或 PRISM(NotificationObjectEventAggregator 除外),.xap 是 Silverlight 的扩展。我的赏金在大约半小时后结束,我仍然没有关于如何解决这个问题的答案,所以我让它过期。如果您的解决方案确实在 XBAP 中有效,那么我将添加第二个赏金并给您积分。
      【解决方案5】:

      应用程序缓存是通过清单文件缓存完成的,当清单签名更改时,运行时会升级本地文件(而且它只是升级更改的文件)。只要确保您在 HTTP 响应中发送了正确的标头即可。有时动态页面缓存设置或托管服务提供商全局设置会干扰。对我来说,它总是开箱即用。

      【讨论】:

        【解决方案6】:

        ClickOnce 对我很有帮助。还要确保正确控制 XBAP 的版本。

        【讨论】:

          【解决方案7】:

          我通过简单地将文件复制到我的 Web 项目中的 ClientBin 目录来部署我的 Xbap。 我在 iframe 中显示它。 要使应用程序“刷新”版本,我必须在构建之前更改 Xbap 项目中的“发布版本”。 项目属性 -> 发布 -> 发布版本。

          这会更改 xbap 和清单文件中的版本,强制客户端下载最新版本。

          【讨论】:

            猜你喜欢
            • 2015-09-16
            • 2021-12-22
            • 2013-12-10
            • 2022-12-19
            • 1970-01-01
            • 2016-03-06
            • 2013-07-12
            • 2014-05-01
            • 1970-01-01
            相关资源
            最近更新 更多