Как вы заставляете Firefox не кэшировать или повторно загружать файл Silverlight XAP?

При работе с Silverlight я заметил, что Firefox будет кэшировать файл XAP, поэтому, если я сделаю обновление, пользователь может застрять в устаревшей версии. Есть ли способ заставить браузер перезагружать файл XAP каждый раз, или, возможно, принудительно делать это только после публикации обновления? Или в конфигурации Silverlight есть параметр, который запрещает браузеру полностью кэшировать файл XAP?

Спасибо джефф

17 ответов

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

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

Таким образом, все, что вам нужно сделать, это увеличить номер версии в файле AssemblyInfo.cs.

Самый простой способ:

<param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" />

Это то, что я делаю в php. Вы читаете дату / время файла xap и добавляете его в качестве параметра к ссылке для скачивания. Таким образом, браузер видит новые версии файлов как новые ссылки, и, следовательно, не в своем кеше.

<?php $fdate = date("dHis",filemtime("MyApp.xap")) ?>

<param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/>

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

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

Для меня лучший ответ от Криса Кернса. Я просто немного адаптировал его, вызывая ToString и GetHashCode, генерируя идентификатор для отметки времени:

<param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" />

Работает просто отлично!

Вы можете отправить HTTP-заголовки, чтобы предотвратить его кэширование:

Cache-control: no-cache
Pragma: no-cache

Как вы это сделаете, зависит от веб-сервера, который вы используете.

Это проверено и работает:

Положи это:

<%
    const string sourceValue = @"ClientBin/MyXapFile.xap";
    string param;

    if(System.Diagnostics.Debugger.IsAttached)
        param = "<param name=\"source\" value=\"" + sourceValue + "\" />";
    else
    {
        var xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + sourceValue;
        var xapCreationDate = System.IO.File.GetLastWriteTime(xappath);

        param = "<param name=\"source\" value=\"" + sourceValue + "?ignore="
        + xapCreationDate + "\" />";
    }
    Response.Write(param);
%>

Вместо этого:

<param name="source" value="ClientBin/MyXapFile.xap" />

Другим решением было бы добавить версию файла XAP, а не метку времени. Отметка времени будет меняться каждый раз (может также отключить кеширование). Чтобы изменить его только после обновления XAP, нужно взять некоторую информацию из файла XAP. Все еще смотрю на то, что я мог бы использовать, возможно, последнюю модифицированную метку даты файла XAP?

Добавление метки времени для XAP сработало для меня (я добавляю элемент управления SL в javascript, но это также легко можно сделать встроенным):

var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;

Вы можете добавить исходный URL в тег объекта с датой последней записи файла XAP. Проверьте код в моем блоге.

Я получаю это на работу с помощью комбинации предложений выше:

  1. Установите для атрибутов cache-control/pragma http-эквивалента метатега значение "No-Cache"
  2. Используйте страницу ASP.NET для размещения элемента управления silverlight (в отличие от HTML-страницы)
  3. Задайте свойство Source элемента управления ASP.NET Silverlight в приведенном ниже коде, добавив отметку времени к URL-адресу.xap, например:

    Silverlight1.Source = "ClientBin/MyApplication.xap?" + DateTime.Now.ToString("дд-мм-гг-чч: мм: сс");

Пока единственное решение, которое я нашел, как только проблема возникла, это очистить кеш Firefox.

Лучшее решение было бы намного лучше.

У меня была эта проблема, поэтому теперь, когда я запускаю новое приложение, я устанавливаю версию сборки на 0.0.0.1 и просто обновляю ее по одному в каждом развертывании, кажется, решил ее для меня. Затем просто установите его обратно на 1.0.0.0 при выпуске.

Супер простая идея: просто добавьте поддельную строку запроса в URL.

<param name="source" value="app.xap?r12345"/>

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

В идеале, ваш сервер должен сделать это за вас. Но если нет...

Мы также находимся в той же ситуации, когда хотим контролировать, когда файл.XAP загружается в браузер.

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

Посмотрите этот блог: IsolatedStorage как кеш объекта Silverlight

Я использую это решение

<object id="Xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2"
width="100%" height="100%">
<%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%>
<%
string orgSourceValue = @"ClientBin/SilverlightApp.xap";
string param;
if (System.Diagnostics.Debugger.IsAttached)
param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />";
else
{
string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue;
DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);
param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore="
+ xapCreationDate.ToString() + "\" />";
}
Response.Write(param);
%>
<param name="onError" value="onSilverlightError" 

Идея строки запроса не работает для меня в Silverlight 4. Кажется, что сервер кэширует проклятый xap (но не файл aspx). Решение, которое работает в SL4, состоит в том, чтобы перейти к свойствам вашего проекта Silverlight, перейти к информации о сборке и ввести версию.

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