如何在客户端计算机上更新XBAP到最新版本?

22
我开发了一个嵌入在ASP.NET网页中的XAML浏览器应用程序(XBAP)。我现在遇到一个问题,就是无法让客户端计算机及时更新最新版本的XBAP。在开发过程中,我不得不使用Mage.exe工具清除应用程序缓存,以便在本地计算机上运行时可以看到我的更改。除了在命令行中执行之外,我还发现 r undll32 dfshim CleanOnlineAppCache同样有效。但我不想要求客户在命令行中运行任何命令。我该怎么做才能让XBAP在客户端计算机上自动更新?更新后的XBAP没有在客户端计算机上刷新,而是继续运行以前的版本。
更新:我为这个问题创建了一个悬赏,因为我也有同样的问题。从我在网上读到的资料来看,XBAP应该将缓存版本号与Web服务器上的版本号进行比较,并在版本号不同时下载新版本。我已验证我的版本号不同,但当我启动XBAP时,仍然运行缓存的副本。如果我在ASP.NET页面外部启动XBAP,也会出现缓存副本,尽管如果我更改URL参数,则会获得新版本。
更新2:我发现XBAP在XP 32位机器上会自动更新,但在我的Windows 7 64位机器上不会。
7个回答

2
多年前,我们在一个普通的网站上遇到了这个问题。它一直困扰着我们,最终,我们不得不为每个新版本更改URL前缀。第一页从未被缓存,并转发到更新的URL。
虽然这只是一个解决方法,但却非常可靠。

2
您可以尝试以下代码。尽管我在XAPs中使用它而不是XBAPs,但它可能也适用于您:

(代码片段如下)

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

编辑

我原先想建议在发布之间递增版本号,但看起来这已经得到解决了。这种行为在所有浏览器中都会发生吗?可能是一些IE特定的 bug/ 奇怪行为(我见过很多只在IE中出现的问题...并不奇怪)


1
该方法似乎不存在于 XBAP 中。 - Rachel
我测试了IE,FireFox和Chrome,它们都无法下载新版本。 - Rachel
1
CheckAndDownloadUpdateAsync 似乎只是 Silverlight 的函数,不适用于 WPF/XBAP。 - John C
对于WPF,请使用以下代码替换上面的代码: new System.Deployment.Application.DeploymentServiceCom().CleanOnlineAppCache();
  • 来自http://stackoverflow.com/questions/11774838/xbap-clear-cache-from-application
- else

0

我将Xbap部署,只需将文件复制到Web项目的ClientBin目录中即可。

我通过iframe显示它。

为使应用程序“刷新”版本,我必须在构建之前更改Xbap项目中的“发布版本”。 项目属性-> 发布-> 发布版本。

这将更改Xbap和清单文件中的版本,迫使客户端下载最新版本。


0

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


0

ClickOnce 对我非常有效。另外,请确保您正确地对 XBAP 进行版本控制。


0

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


我想将应用程序嵌入网站中,而ClickOnce会使其在站外运行。此外,ClickOnce应用程序的加载时间比我想要的长。 - Rachel

0

如果缓存头不正确,您的浏览器可能会阻止下载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。

此方法基于检查主机程序集版本,所以请确保递增以下版本号:

[assembly: AssemblyVersion("3.4.9.0")] [assembly: AssemblyFileVersion("3.4.9.0")]

如果你下载了动态模块,则这种解决方案不能解决。如果这是你的问题,你需要修复实际的缓存头信息。

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

    //https://dev59.com/LHM_5IYBdhLWcg3w8IHR
//http://developer.yahoo.com/performance/rules.html#expires
//http://ray.jez.net/prevent-client-side-caching-with-httpmodules/
//https://dev59.com/unE95IYBdhLWcg3whOHK
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
}

这样做不会在每次运行时重新下载应用程序吗?缓存的整个目的是为了避免重新下载,我喜欢这样做是因为它可以加快启动时间。 - Rachel
只有在新版本发布时才会重新下载。创建的URL基于主机网站的AssemblyVersion(我将其与使用链接文件的应用程序保持相同)。因此,缓存仍然有效。如果您动态下载新程序集,则可能仍然存在相同的缓存问题,可以通过http://compositewpf.codeplex.com/discussions/240811?ProjectName=compositewpf解决。 - Leblanc Meneses
你知道如何在XBAP中实现这个吗?(或者它是否可能?)你发布的代码和链接似乎只适用于Silverlight。 - Rachel
该链接并不特定于SL,而是更加特定于Prism基础设施以及如何按需管理程序集。我实际上已经将其列入待办事项,但还没有时间实现。目前我已经永久禁用了缓存,直到我构建加载器为止。我宁愿下载速度慢一些,也不想让应用程序出现故障。我已经添加了我构建的HttpModule来禁用.XAP文件的缓存...您可以添加您的扩展名以使文件被缓存且不更新。(添加到原始评论中) - Leblanc Meneses
我仍然不清楚如何在XBAP中实现这一点,XBAP是在Web浏览器中运行的WPF应用程序,而不是Silverlight应用程序。我不使用MVC或PRISM(除了NotificationObjectEventAggregator之外),而.xap是Silverlight的扩展名。我的悬赏将在大约半个小时后结束,我仍然没有关于如何解决此问题的答案,因此我让它过期。如果您的解决方案确实适用于XBAP,则我将添加第二个悬赏并给您积分。 - Rachel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接