2011-05-06 51 views
21

我開發了嵌入在ASP.NET網頁中的XAML瀏覽器應用程序(XBAP)。我在獲取最新版本的XBAP以在客戶端計算機上更新時遇到問題。在開發過程中,我不得不使用Mage.exe工具清除應用程序緩存,以便在我的本地計算機上運行時看到我的更改。除了在命令行中執行Mage.exe -cc之外,我還發現rundll32 dfshim CleanOnlineAppCache也可以正常工作。如何在客戶端計算機上將XBAP升級到最新版本?

但是,我不想讓客戶在命令行中運行任何命令。爲了使XBAP在客戶端計算機上自動更新,我需要做些什麼?而不是客戶端計算機上更新的XBAP刷新,先前版本的XBAP將繼續運行。

更新

我創建了一個賞金對這個問題,因爲我有同樣的問題。從我在線閱讀的內容來看,XBAP應該將緩存的版本#與Web服務器上的版本#進行比較,如果不同,請下載新版本。我已驗證我的版本號是不同的,但緩存副本仍然是啓動XBAP時正在運行的副本。

如果我在asp.net頁面之外啓動XBAP,也會出現緩存副本,但如果更改url參數,我會得到新版本。

更新#2

我發現XBAP並自動對XP 32位機器更新,但不是我的Windows 7 64位計算機上。

回答

3

你可以嘗試這樣的事情,雖然我用它在XAPs不XBAP的它可能爲你工作了:

(摘錄如下)

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

編輯

要去建議增加版本號之間的版本號,但它似乎已被照顧。這種行爲是否發生在所有瀏覽器上?可能是一些IE特定的錯誤/怪異(我看過很多IE瀏覽器的錯誤行爲...不會讓我感到驚訝)

+1

該方法似乎並不存在於我用IE,FireFox和Chrome測試的XBAP – Rachel 2011-11-03 15:50:14

+0

中,並且它們都無法下載新版本。 – Rachel 2011-11-04 18:30:53

+1

[CheckAndDownloadUpdateAsync](http://msdn.microsoft.com/en-us/library/system.windows.application.checkanddownloadupdateasync(v = vs.95).aspx)似乎是僅Silverlight的函數,而不是WPF/XBAP。針對WPF的 – 2012-02-13 19:04:22

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,其瀏覽器不能在這一點上緩存。 它是基於檢查主機集版本所以一定要增加 [裝配:的AssemblyVersion( 「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 
} 
+0

它會不會重新下載應用程序的任何時候運行?緩存它的全部重點是它不會重新下載,我喜歡它,因爲它使啓動時間更快。 – Rachel 2011-11-08 13:08:07

+0

只有在新版本中才會重新下載。創建的url基於主機網站AssemblyVersion(我保持它與使用鏈接文件的應用程序相同)。所以緩存仍然有效。如果你動態下載新的程序集,你可能仍然會有相同的緩存問題,可以通過http://compositewpf.codeplex.com/discussions/240811?ProjectName=compositewpf – 2011-11-08 23:29:51

+0

解決你知道如何在XBAP中實現它嗎? (或者甚至可能?)您發佈的代碼和鏈接看起來都只是針對Silverlight。 – Rachel 2011-11-09 12:56:04

0

您可以使用ClickOnce部署應用程序。如果您想強制用戶更新,只需爲應用程序設置最低要求版本(位於「應用程序更新」對話框中)。

+0

我想將應用程序嵌入網站中,並且ClickOnce將使其在網站外部運行。另外,ClickOnce應用程序的加載時間比我更喜歡。 – Rachel 2011-11-08 13:06:42

0

應用程序緩存是通過清單文件緩存完成的,當清單簽名更改時,運行時將升級本地文件(此外,它只是升級更改的文件)。只要確保你有正確的標題發送HTTP響應。有時動態頁面緩存設置或託管提供商全局設置會干擾。對我來說,它始終是開箱即用的。

0

ClickOnce爲我工作就像一個魅力。另外請確保您正確版本化您的XBAP。

2

幾年前,我們遇到了一個普通網站的問題。它一直在困擾着我們,最終我們改變了每個新版本的URL前綴。第一頁從未被緩存,並被轉發到更新的網址。

我知道它是一種解決方法,但它非常可靠。

0

我通過簡單地將文件複製到我的web項目中的ClientBin目錄來部署我的Xbap。 我在iframe中顯示它。 要使應用程序「刷新」版本,我必須在構建之前更改Xbap項目中的「發佈版本」。 項目屬性 - >發佈 - >發佈版本。

這改變了xbap和清單文件中的版本,迫使客戶端下載最新版本。

相關問題