Silverlight 5 - установка / обновление OOB прервано при использовании анти-кеш-трюка

Я использовал трюк с отметкой времени на Silverlight <объект> (см. GetLastWriteTime() используя ответы в разделе Как заставить Firefox не кэшировать или повторно загружать файл Silverlight XAP?) успешно с Silverlight 4.

При использовании Silverlight 5 runtime * функция установки / автоматического обновления OOB теперь кажется отключенной. У меня есть две проблемы:

  • при запуске в браузере текущее состояние установки всегда "не установлено" (в коде: Application.Current.InstallState == System.Windows.InstallState.NotInstalled всегда true)
  • при запуске в режиме OOB всегда говорится, что доступна новая версия (в коде: CheckAndDownloadUpdateAsync() всегда возвращается с e.Error == null а также e.UpdateAvailable == true).

Кто-нибудь еще сталкивался с этим, и еще лучше, есть обходной путь?


* Точность: в настоящее время мое приложение построено с использованием инструментов Silverlight 5, но нацелено на Silverlight 4 и отлично работает в среде выполнения Silverlight 4 Developer. Проблема возникает (по крайней мере) на моем компьютере разработчика, использующем Silverlight 5 Developer Runtime.


Обновление: я проверил с Fiddler, что происходит на моей коробке разработчика. Когда запускается процесс обновления, я вижу:

GET /ClientBin/Client.xap?timestamp=23%2f01%2f2012+17%3a42%3a14 HTTP/1.1
If-Modified-Since: Tue, 24 Jan 2012 09:10:07 GMT

Это хорошо для меня, за исключением того, что сервер (Сервер: ASP.NET Development Server/10.0.0.0, X-AspNet-Version: 4.0.30319) возвращает новую версию со следующими заголовками кэша:

HTTP/1.1 200 OK
Cache-Control: private
Date: Tue, 24 Jan 2012 09:11:28 GMT

Каждый раз, когда я запускаю приложение, в запросе на проверку указывается правильная дата (ранее возвращенная сервером), и каждый раз сервер сообщает, что у него есть новая версия с текущей датой. Я постараюсь настроить конфиг сервера.

Обновление 2: в моем файле Web.config была директива управления кэшем, но удаление ее решило только половину проблемы. Теперь приложение в браузере обнаруживает, что установка OOB в порядке, но цикл обновления продолжается с той же трассировкой Fiddler.

Обновление 3: проблема определенно связана с отладочным веб-сервером. У того же приложения, развернутого на соответствующем IIS с тем же Web.config, такой проблемы нет. Но это по-прежнему раздражает, поскольку значительно замедляет процесс отладки OOB.

Update4: На самом деле, проблема все еще присутствует даже в моем основном развертывании IIS, и произошла на других серверах (и с использованием PHP для создания метки времени вместо ASP.NET). Так что любая помощь приветствуется.

Обновление 5: Как и требовалось, вот мой код, довольно простой:

private void CheckAndDownloadUpdateCompleted(object sender, System.Windows.CheckAndDownloadUpdateCompletedEventArgs e)
{
    if (e.Error != null)
    {
        if (e.Error is PlatformNotSupportedException)
        {
            UpdateType = UpdateTypes.PlatformUpdate;
            //(...)
            return;
        }
        else if (e.Error is SecurityException)
        {
            UpdateType = UpdateTypes.ElevationRequired;
            //(...)
            return;
        }
        else
        {
            // Error handling code
            //(...)
        }
    }
    else if (e.UpdateAvailable)
    {
        UpdateType = UpdateTypes.Available;
        //(...)
        return;
    }

    UpdateType = UpdateTypes.NoUpdate;

    //(...)
}

UpdateType это свойство типа enum, которое позволяет мне выбрать правильную локализованную строку где-то еще.

Update6: различные //(...) части (косвенно) меняют вид приложения, UpdateType не является.

3 ответа

У меня та же проблема при запуске как OOB из Visual Studio

Что касается удаленного запуска из IIS, я заметил, что мне нужно отредактировать политику кэширования, которую я добавил в web.config. В ней всегда будет отображаться логотип прогресса обновления / загрузки (но загрузка будет происходить быстрее, чем при наличии новой версии, только частичная). загрузка может быть, но раздражает видеть прогресс загрузки даже на некоторое время каждый раз)

Мне пришлось удалить (закомментировать) часть, которая пыталась кэшировать.xap, пока не изменилось

<caching>
  <profiles>
    <add extension=".xap" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
  </profiles>
</caching>

Я подозреваю, что это как-то связано с тем, что встроенный сервер разработки Cassini / Visual Studio и SL5 по какой-то причине плохо играют вместе.

Я также использую трюк анти-кэширования, о котором вы упомянули, и я испытывал то же поведение, что и Application.Current.InstallState, всегда сообщающий о NotInstalled, а также CheckAndDownloadUpdateAsync(), всегда сообщающий e.UpdateAvailable = true.

Поэтому я изменил конфигурацию своего веб-проекта, чтобы использовать IIS Express вместо встроенного сервера разработки Visual Studio, и переустановил приложение Silverlight на рабочем столе. Наконец все заработало как положено. В словах заказа Application.Current.InstallState = Installed и CheckAndDownloadUpdateAsync() сообщает e.UpdatedAvailable = false.

Обновление:

Извините, я не видел, что вы также испытываете это при развертывании IIS в реальном времени.

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

Мой анти-кеш HTML в соответствии с запросом:

<div id="silverlightControlHost" align="center" style="height:100%">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight2" width="100%" height="100%">
      <%
          string source = @"~/ClientBin/EskomVDT.SL.xap";
          string param;

          if(System.Diagnostics.Debugger.IsAttached) {
              param = "<param name=\"source\" value=\"" + VirtualPathUtility.ToAbsolute(source) + "\" />";                                   
          }
          else {
              string xapPath = HttpContext.Current.Server.MapPath(source);
              DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xapPath);

              param = "<param name=\"source\" value=\"" + VirtualPathUtility.ToAbsolute(source) + "?ignore=" + xapCreationDate.ToString("yyyy-MM-dd-hh-mm-ss") + "\" />";
          }

          Response.Write(param);
      %>
      <param name="onError" value="onSilverlightError" />
      <param name="background" value="white" />
      <param name="minRuntimeVersion" value="5.0.61118.0" />
      <param name="autoUpgrade" value="true" />
      <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" style="text-decoration:none">
          <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
      </a>      </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe>
</div>

Я рекомендую не использовать подход DateTime.
Вместо этого добавьте номер версии к URL-адресу xap.

редактировать
Извините, только что заметил, что вы используете LastWriteTime, что должно быть хорошо.

Попробуйте использовать fiddler для просмотра сетевого трафика, когда xap обслуживается через IIS.

Кроме того, покажите нам свой код, который выполняет проверку установленного OOB.

Редактировать 2

Какое значение по умолчанию для UpdateType? Возможно, код, проверяющий значение UpdateType, мог бы выполняться до вызова CheckAndDownloadUpdateCompleted.

Что касается Application.Current.InstallState, подключитесь к событию App.Current.InstallStateChanged.
Я думаю, что значением по умолчанию для Application.Current.InstallState является System.Windows.InstallState.NotInstalled до тех пор, пока среда выполнения Silverlight не закончит проверку состояния установки, и в этом случае он запускает событие InstallStateChanged.

Когда ваша страница загружена в ваш веб-браузер, проверьте ее источник HTML, возможно, время последней записи файла неожиданно обновляется.

Другие вопросы по тегам