2012-01-23 4 views
3

я использовал трюк метку времени на объекте > Silverlight < (см GetLastWriteTime(), используя ответы в How do you force Firefox to not cache or re-download a Silverlight XAP file?) успешно с Silverlight 4.Silverlight 5 - OOB установка/обновление сломана при использовании анти-кэш трюк

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

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

Неужели кто-то еще столкнулся с этим, и еще лучше, имеет обходное решение?


* Точность: В настоящее время мое приложение построено с использованием Silverlight 5 Tools, но ориентирована на Silverlight 4, и отлично работает на платформе Silverlight 4 Время воспроизведения. Проблема возникает (по крайней мере) на моей машине dev с использованием Silverlight 5 Developer Runtime.


Update: Я проверил с Скрипач, что происходит на моем Dev поле. Когда процесс обновления вызывается, я вижу:

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-Сеть САШ-версии: 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). Поэтому любая помощь приветствуется.

Update5: В соответствии с просьбой, вот мой код, довольно прост:

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

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

+0

Я испытал аналогичная проблема при использовании веб-сервера xsp от Mono и сообщила об ошибке здесь: https://bugzilla.novell.com/show_bug.cgi?id=649789. Как вы тестируете обновление? Я не уверен, но, возможно, e.UpdateAvailable указывает, что обновление среды Silverlight доступно вместо простого обновления программы? Когда я использую IIS, это не проблема, потому что IIS использует встроенный контроль кеша. Как вы устанавливаете приложение OLE Silverlight? –

+0

У меня есть кнопка в моем приложении, которая видна только в том случае, если приложение еще не установлено. Это не работает (приложение сообщается как не установлено, когда оно есть на самом деле). – jv42

+0

Иногда я также использую функцию правого щелчка => Установить, те же результаты. – jv42

ответ

0

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

Редактировать
К сожалению, только что заметил, что вы используете LastWriteTime, которое должно быть в порядке.

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

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

Edit 2

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

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

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

+1

Я добавил код обнаружения обновлений. – jv42

1

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

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

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

Update:

К сожалению, не видел, что вы столкнулись с этим, а также на развертывание живых IIS.

Update 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> 
+0

Ну, для части обнаружения установки вы правы, встроенный сервер испортился хуже, чем IIS (или неизвестный поставщик PHP на клиентском веб-сайте). Но моя настоящая проблема - это обнаружение обновлений, которое, к сожалению, сохраняется. – jv42

+0

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

+0

Не могли бы вы показать свой собственный код анти-кеширования? Или, по крайней мере, итоговый HTML? – jv42

1

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

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

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

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