Как заставить Firefox не кэшировать или повторно загружать XAP-файл Silverlight? - PullRequest
50 голосов
/ 21 ноября 2008

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

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

Ответы [ 17 ]

31 голосов
/ 24 сентября 2009

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

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

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

12 голосов
/ 02 сентября 2009

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

<param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" />
6 голосов
/ 10 декабря 2009

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

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

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

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

5 голосов
/ 10 июня 2011

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

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

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

4 голосов
/ 21 ноября 2008

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

3 голосов
/ 21 ноября 2008

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

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

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

2 голосов
/ 27 октября 2010

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

var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;
2 голосов
/ 08 ноября 2011

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

Поместите это:

<%
    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" />
2 голосов
/ 10 июля 2009

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

1 голос
/ 01 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...