Подтвердить что ты не робот

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

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

Спасибо, Джеф

4b9b3361

Ответ 1

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

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

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

Ответ 2

Простейший способ:

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Хорошо работает!

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Положите это:

<%
    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" />

Ответ 10

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

  • Установить атрибуты кеша кеша meta tag/pragma http-equiv в "No-Cache"
  • Используйте страницу ASP.NET для размещения элемента управления silverlight (в отличие от страницы html).
  • Задайте свойство Source элемента управления ASP.NET Silverlight в коде позади, добавив отметку времени к URL-адресу .xap, например.

    Silverlight1.Source = "ClientBin/MyApplication.xap?" + DateTime.Now.ToString( "dd-MM-yy-HH: mm: ss" );

Ответ 11

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

Ответ 12

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

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

Посмотрите этот блог: Изолированный хранилище в кеше объектов Silverlight

Ответ 13

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

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

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

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

Ответ 14

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

Ответ 15

До сих пор единственным решением, которое я обнаружил, когда проблема возникает, заключается в очистке кеша Firefox.

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

Ответ 16

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

<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" 

Ответ 17

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