Как заставить повторно скачать файл Silverlight XAP

Я пытаюсь выяснить, как заставить браузер повторно загрузить файл.xap, если доступна новая версия, а старая все еще кэшируется в браузере.

Я видел другую ветку: как заставить Firefox не кэшировать или повторно загружать XAP-файл Silverlight?

Лучшее решение, кажется, это:

protected void Page_Load(object sender, EventArgs e)
{
    var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
    this.myApp.Source += "?" + versionNumber;
}

Тем не менее, я не получаю часть this.myApp. Что это за объект? Прошу прощения за повторное открытие этого, но я бы хотел, чтобы люди публиковали полные решения.

Спасибо

3 ответа

Решение

То, на что вы смотрите - это код, основанный на asp:Silverlight контроль веб-сервера, но этот контроль был прекращен с Silverlight 3 и выше.

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

В качестве тега объекта это будет выглядеть примерно так:

<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
      <param id="xapSource" runat="server" name="source" value="ClientBin/SilverlightApplication1.xap"/>
      <param name="onError" value="onSilverlightError" />
      <param name="background" value="white" />
      <param name="minRuntimeVersion" value="4.0.50303.0" />
      <param name="autoUpgrade" value="true" />
      <param name="initParams" id="initParams" runat="server" />
      <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50303.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>
</form>

Обратите внимание на id и runat="server" в исходном параметре. При этом загрузка страницы может выглядеть примерно так:

protected void Page_Load(object sender, EventArgs e)
{
    string xapPhysicalPath = Server.MapPath(xapSource.Attributes["value"]);
    DateTime lastWrite = System.IO.File.GetLastWriteTime(xapPhysicalPath);
    xapSource.Attributes["value"] = xapSource.Attributes["value"] + "?" + lastWrite.ToString("yyyyMMddThh:mm:ss");

}

Это гарантирует, что URL, используемый для источника, всегда будет меняться при изменении xap. Исходный код, с которым вы столкнулись, имеет недостатки: у xap все еще есть возможность измениться без изменения номера версии полностью не связанной сборки.

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

value="ClientBin/SilverlightApplication1.xap?<%=DateTime.Now%>"

Надеюсь это поможет.

MyApp, вероятно, является веб-элементом управления, который отображает объект Silverlight на странице.

Устанавливая его свойство Source, URL-адрес, указывающий на XAP, получает параметр, который отличается от предыдущей версии, в результате чего браузер лишает законной силы кэшированный xap(для этого параметра было установлено другое значение).

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