Каков наилучший способ обеспечить повторную загрузку содержимого веб-страницы с вашего веб-сайта вместо использования кэшированных временных файлов Интернета? - PullRequest
4 голосов
/ 21 июля 2009

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

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

Эти файлы будут обновляться только во время выполнения программы установки, поэтому я могу программно установить что-то, чтобы это произошло?

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

Вы можете добавить случайное число или значение даты / времени к строке запроса.

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

Например:

var xmlPath = "www.domain.com?vers="+new Date().getTime();+"";
1 голос
/ 21 июля 2009

Много программных решений до сих пор. Однако решение заключается в простой настройке директивы ClientBin (или любой другой папки, в которой вы храните ваши XAP) на сервере.

Предполагая, что IIS вам нужно явно указать папку ClientBin, срок действия истекает немедленно. Это приведет к отправке правильных заголовков конфигурации кэша при получении XAP. В свою очередь, браузер будет пытаться удалить XAP каждый раз, когда это необходимо, но в подавляющем большинстве случаев просто получит немодифицированный ответ 304 и сможет продолжать использовать свою кэшированную копию.

Полагаю, вы видите классическую эвристическую проблему IE. В отсутствие каких-либо заголовков конфигурации кэша IE решает, стоит ли вообще пытаться повторно запросить ресурс в соответствии со своими собственными внутренними алгоритмами. Обеспечивая отправку правильных заголовков истечения, IE будет выполнять инструкции серверов.

Редактировать

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

Указав функцию «Немедленно истечь» в IIS, мы получаем следующие заголовки в ответе: -

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 22359
Content-Type: application/octet-stream
Last-Modified: Tue, 21 Jul 2009 11:59:28 GMT
ETag: "fe734cb3fa9ca1:1352"

Это не мешает кэшированию XAP, это просто означает, что браузер не может использовать кэшированный XAP без предварительного запроса его с сервера. Обратите внимание на заголовки Last-Modified и ETag.

Последующий запрос выглядит так: -

GET /clientBin/SomeApp.xap HTTP/1.1
If-Modified-Since: Tue, 21 Jul 2009 11:59:28 GMT
If-None-Match: "fe734cb3fa9ca1:135a"
Host: myhost.com

Ответ: -

HTTP/1.1 304 Not Modified
Cache-Control: no-cache
Last-Modified: Tue, 21 Jul 2009 11:59:28 GMT
Tag: "fe734cb3fa9ca1:135a"

Этот ответ не содержит тела объекта, он дает браузеру разрешение на использование и использование существующего XAP в кэше.

Если XAP большой, то, возможно, браузер на самом деле не кеширует его с помощью Cache-Control, заданного как no-cache. Следовательно, на самом деле может быть лучше быть более явным.

Вместо использования поля Expires Immediately используйте настройку заголовка Cache-Control, используя список пользовательских заголовков. Укажите: -

Cache-Control: max-age=0

Это приведет к тому, что браузер будет кэшировать большие XAP, но сразу же их истечет.

0 голосов
/ 21 июля 2009

Я думаю, что вы можете сделать что-то подобное: очевидно, сделайте это в базовом классе, который будет использовать каждая страница. Поэтому создайте как PageBase, которая наследует System.Web.UI.Page, и весь ваш код наследуется от PageBase.

или сделайте это на главной странице.

protected void Page_Init(object sender, EventArgs e) {
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
}
0 голосов
/ 21 июля 2009

Ваш вопрос немного расплывчатый, так как я не знаю, какие инструменты вы используете. Я приведу примеры на PHP.

Вы захотите установить заголовок Cache-Control, чтобы указать максимальный срок хранения файла в кэше. Значение указывается в секундах.

например.

<?php
header("Cache-Control","max-age=86400");

Вы должны установить этот заголовок перед отправкой файла XAP пользователю. 86400 секунд = 1 день.

Другой альтернативой является использование разных имен файлов для каждой версии файла. Вы можете сделать это одним из двух способов.

Встраивание версии # в имя файла:

some_file_1_1.xap
some_file_1_2.xap

Или я предпочитаю добавить номер версии к имени файла в виде строки запроса:

some_file.xap?20090719
some_file.xap?20090720

Вы будете ссылаться на эти файлы с соответствующим номером «версии» в вашем HTML, и когда # версия изменится, браузер посчитает это изменением имени файла и принудительно загрузит его заново. Вы можете использовать все, что вы хотите для строки "version" - параметры могут включать: номер редакции, последний измененный набор дат и т. Д.

Если вы решите изменить имя файла в каждой ревизии, я бы предложил использовать кэширование «далекого будущего». Обеспечение кеширования файла в течение безумно долгого времени уменьшит нагрузку на ваш сервер. Вы можете сделать это, как показано выше с PHP, и вот несколько примеров, чтобы сделать это с mod_expires в Apache 2.0.

ExpiresActive on
ExpiresByType application/x-silverlight-app “access plus 5 years”
FileETag none
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...