Silverlight 5 - установка / обновление OOB прервано при использовании анти-кеш-трюка - PullRequest
3 голосов
/ 23 января 2012

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

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

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

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


* Точность: В настоящее время мое приложение создано с использованием инструментов Silverlight 5, но нацелено на Silverlight 4 и прекрасно работает насреда разработки Silverlight 4 для разработчиков.Проблема возникает (по крайней мере) на моем компьютере разработчика, использующем 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

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

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

Update3: Проблема определенно связана с отладкойвеб сервер.У того же приложения, развернутого на соответствующем 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 ]

1 голос
/ 25 апреля 2012

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

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

Поэтому я изменил конфигурацию своего веб-проекта на использование IIS Express вместо встроенногоVisual Studio Development Server и переустановил приложение Silverlight на рабочий стол.Наконец все заработало как положено.В словах заказа Application.Current.InstallState = Установлено и 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>
1 голос
/ 22 июля 2013

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

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

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

<caching>
  <profiles>
    <add extension=".xap" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
  </profiles>
</caching>
0 голосов
/ 25 февраля 2012

Я рекомендую не использовать подход 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, возможно, последнее время записи файла неожиданно обновляется.

...