Silverlight: как заставить браузер загружать обновленную версию клиента? - PullRequest
7 голосов
/ 22 июля 2010

Приложение My Silverlight (4.0) (размещенное на веб-сайте ASP.NET) использует 4 проекта, все они используют один файл с версией сборки:

[assembly: AssemblyVersion("1.0.*")]

Версия отображаемого в данный момент приложения - 1.0.3842.38865, но более новая версия (1.0.3854.42448) недавно загружена на сервер.

Проблема в том, что браузер не загружает новое приложение Silverlight после его развертывания на сервере.

Вот HTML-код, который используется для «рендеринга» silverlight-html-loader (не уверен, что это правильное имя):

<div id="silverlightControlHost" style="height:950px"> 
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
  <param name="source" value="/ClientBin/VfmElitaSilverlightClientApplication.xap"/> 
  <param name="onError" value="onSilverlightError" /> 
  <param name="background" value="white" /> 
  <param name="initParams" value="adr=squad,team=811,match=3217203" /> 
  <param name="minRuntimeVersion" value="3.0.40624.0" /> 
  <param name="autoUpgrade" value="true" /> 
  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none"> 
      <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/> 
  </a> 
</object> 
<iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe> 

Я попытался добавить параметр к параметру «source» объекта, который содержит время последней модификации XAP-файла:

  <param name="source" value="/ClientBin/VfmElitaSilverlightClientApplication.xap?Ver=2010072243523AM"/>

Это вызвало ошибку загрузки приложения Silverlight:

Необработанная ошибка в Silverlight Код заявки: 2103 Категория: Сообщение InitializeError: Неверное или неправильно сформированное приложение: Проверьте манифест

Не могли бы вы посоветовать, как заставить браузер получать новое приложение с сервера (без манипуляции с кэшем браузера, я хотел бы оставить опцию кэширования браузера)?

Большое спасибо!

P.S. Необходимо добавить, что приложение silverlight прекрасно работает (загружается и запускается) на моем локальном хосте без каких-либо танцев с параметрами. Только когда я загружаю его на веб-сайт - он не загружается браузером. И добавление дополнительных параметров в путь к xap-файлу - не работает на localhost.

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

Я все еще тестирую, но пока кажется, что изменение AssmeblyFileVersion заставляет браузер загрузить последнюю версию файла xap.Используя Silverlight 4, я попробовал многие другие предлагаемые решения и не смог заставить их работать, или они были нежелательны (например, не кэширование вообще).Теперь я увеличиваю версию файла, и она, кажется, каждый раз захватывает последнюю версию xap.

[assembly: AssemblyFileVersion("1.0.0.1234")]
4 голосов
/ 26 ноября 2010

В настоящее время мы используем следующее, которое получает время последней записи .xap-файла и добавляет его к параметру source:

<object ... >
        <%
            var source = "ClientBin/App.xap";
            string param;
            if (System.Diagnostics.Debugger.IsAttached)
                param = string.Format("<param name=\"source\" value=\"{0}\" />", source);
            else
            {
                var path = HttpContext.Current.Server.MapPath(string.Empty) + "\\" + source;
                var xapCreatedAt = System.IO.File.GetLastWriteTime(path);
                param = string.Format("<param name=\"source\" value=\"{0}?version={1}\" />",
                    source,
                    xapCreatedAt.ToString("yyyyMMddTHHmmssfff"));
            }
            Response.Write(param);
        %>
        <param ...
2 голосов
/ 22 июля 2010

Это должно работать как положено, возможно, это как-то связано с тем, как вы добавляете параметр. Попробуйте удалить Ver= часть:

<param name="source"
    value="/ClientBin/VfmElitaSilverlightClientApplication.xap?2010072243523AM"/> 

Я использовал этот метод в прошлом, и это лучший способ обойти любое кэширование на стороне клиента.

Если вы хотите, чтобы он всегда обновлялся и никогда не кэшировался, вы можете просто добавить текущий DateTime в конец, который также всегда будет уникальным. Не уверен, когда вы захотите сделать это в реальном сценарии, но это здорово для тестирования, чтобы убедиться, что у вас никогда не работает кешированная версия. Например:

<param name="source"
    value="/ClientBin/VfmElitaSilverlightClientApplication.xap?<%= DateTime.Now.Ticks.ToString() "/>

Если это не сработает, просто удалите все это вместе без добавления в конец и посмотрите, загружается ли оно. У меня такое ощущение, что ошибка в чем-то другом, поскольку она не относится к местоположению файла xap.

1 голос
/ 22 июля 2010

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

В диспетчере IIS укажите, что срок действия содержимого папки ClientBin истекает немедленно.

Обратите внимание, что это не означает, что Xap будет загружаться при каждом запросе, просто браузер должен проверять актуальность своей кэшированной копии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...