Как обновить XBAP до последней версии на клиентском компьютере?

Я разработал приложение браузера XAML (XBAP), встроенное в веб-страницу ASP.NET. У меня проблема с обновлением последней версии XBAP на клиентском компьютере. Во время разработки мне пришлось использовать инструмент Mage.exe для очистки кеша приложения, чтобы мои изменения были видны при запуске на моем локальном компьютере. Помимо выполнения Mage.exe -cc в командной строке, я также обнаружил, что rundll32 dfshim CleanOnlineAppCache работает так же хорошо.

Однако я не хочу просить клиентов запускать какие-либо команды в командной строке. Что мне нужно сделать, чтобы XBAP автоматически обновлялся на клиентском компьютере? Вместо обновленного обновления XBAP на клиентском компьютере продолжает работать предыдущая версия XBAP.

Обновить

Я назначил награду за этот вопрос, потому что у меня такая же проблема. Из того, что я читал в Интернете, XBAP должны сравнивать кешированную версию # с версией # той, которая находится на веб-сервере, и загружать новую версию, если она отличается. Я убедился, что номера версий у меня разные, но кешированная копия по-прежнему работает, когда я запускаю XBAP.

Кешированная копия также появляется, если я запускаю XBAP за пределами страницы asp.net, хотя я получаю новую версию, если я изменяю параметры URL-адреса.

Обновление №2

Я обнаружил, что XBAP автоматически обновляется на 32-битных машинах XP, но не на моей 64-битной машине с Windows 7.


person Alcy    schedule 06.05.2011    source источник


Ответы (7)


Вы можете попробовать что-то вроде этого, хотя я использую его в XAP, а не в 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 ... меня не удивило бы)

person Alex    schedule 03.11.2011
comment
Этот метод не существует в XBAP - person Rachel; 03.11.2011
comment
Я тестировал IE, FireFox и Chrome, и все они не смогли загрузить новую версию. - person Rachel; 04.11.2011
comment
CheckAndDownloadUpdateAsync похоже, это функция только для Silverlight, а не для WPF / XBAP. - person John C; 13.02.2012
comment
для WPF; замените приведенный выше код на new System.Deployment.Application.DeploymentServiceCom (). CleanOnlineAppCache (); - любезно предоставлено stackoverflow.com/questions/11774838/ - person else; 25.02.2016

Несколько лет назад у нас была эта проблема с обычным веб-сайтом. Это продолжало нас преследовать, и в конце концов мы изменили префикс URL-адреса для каждой новой версии. Самая первая страница никогда не кэшировалась и перенаправлялась на обновленный URL.

Это обходной путь, я знаю, но очень надежный.

person Community    schedule 21.01.2012

Вы можете использовать ClickOnce для развертывания приложения. Если вы хотите заставить пользователя обновиться, просто установите минимально необходимую версию для приложения (это в диалоговом окне «Обновления приложения»).

person Ekk    schedule 08.11.2011
comment
Я хочу, чтобы приложение было встроено в веб-сайт, а ClickOnce заставит его работать за пределами сайта. Кроме того, время загрузки приложений ClickOnce больше, чем я предпочитаю. - person Rachel; 08.11.2011

без правильных заголовков кеша ваш браузер может препятствовать загрузке 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: код для отключения кеширования браузера

    //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
}
person Leblanc Meneses    schedule 08.11.2011
comment
Не будет ли это повторно загружать приложение каждый раз, когда оно запускается? Весь смысл кеширования в том, чтобы он не загружался повторно, что мне нравится, потому что это ускоряет время запуска. - person Rachel; 08.11.2011
comment
только в новых выпусках он будет загружаться повторно. Созданный URL-адрес основан на AssemblyVersion веб-сайта хоста (я сохраняю его таким же, как приложение, использующее связанные файлы). Так что кеширование по-прежнему работает. Если вы динамически загружаете новые сборки, у вас могут остаться те же проблемы с кешированием, которые можно решить с помощью compositewpf .codeplex.com / обсуждения / - person Leblanc Meneses; 09.11.2011
comment
Вы знаете, как реализовать это в XBAP? (или если это вообще возможно?) Код и ссылка, которые вы разместили, выглядят так, как будто они предназначены только для Silverlight. - person Rachel; 09.11.2011
comment
ссылка не относится к sl, она более специфична для инфраструктуры призмы и того, как вы управляете сборками по запросу. У меня действительно есть это в моей очереди на реализацию, но у меня не было времени. В настоящее время у меня кеширование отключено навсегда, пока я не соберу загрузчик. Я предпочитаю медленную загрузку, чем сломанное приложение. Я добавил httpmodule, который я построил, чтобы отключить кеширование для .xap .. вы можете добавить свои расширения для файлов, которые кэшируются, но не обновляются. (добавлено к исходному комментарию) - person Leblanc Meneses; 09.11.2011
comment
Я до сих пор не понимаю, как бы я реализовал это в XBAP, который представляет собой приложение WPF, работающее в веб-браузере, а не в приложении Silverlight. Я не использую MVC или PRISM (кроме NotificationObject и EventAggregator), а .xap - это расширение для Silverlight. Моя награда заканчивается примерно через полчаса, и у меня до сих пор нет ответа о том, как я могу исправить эту проблему, поэтому я даю срок ее действия. Если ваше решение действительно работает в XBAP, я добавлю вторую награду и дам вам баллы. - person Rachel; 10.11.2011

Кэширование приложений осуществляется через кеширование файлов манифеста, когда манифестирует изменения сигнатур, среда выполнения обновляет локальные файлы (более того, она просто обновляет измененные файлы). Просто убедитесь, что у вас есть правильные заголовки, отправленные в HTTP-ответах. Иногда мешают настройки кеширования динамических страниц или глобальные настройки хостинг-провайдеров. По мне всегда работает из коробки.

person Jairo Andres Velasco Romero    schedule 15.12.2011

ClickOnce сработал для меня как шарм. Также убедитесь, что вы правильно поддерживаете версию своего XBAP.

person grzegorz_p    schedule 05.01.2012

Я развертываю свой Xbap, просто копируя файл в каталог ClientBin своего веб-проекта. Отображаю в iframe. Чтобы обновить версию приложения, мне нужно изменить «Опубликовать версию» в проекте Xbap перед сборкой. Свойства проекта -> Опубликовать -> Опубликовать версию.

Это изменяет версию в xbap и файле манифеста, заставляя клиентов загружать новейшую версию.

person Grzegorz W    schedule 14.08.2012