Как заставить браузер клиента загружать изображения с сервера, а не использовать его кеш - PullRequest
1 голос
/ 20 мая 2010

Предположим простую страницу ввода данных aspx, на которой администратор может загрузить изображение, а также некоторые другие данные. Они сохраняются в базе данных, и в следующий раз администратор посещает эту страницу для редактирования записи, извлечения данных изображения и предварительного просмотра, сгенерированного и сохраненного на диск (с использованием GDI +), а предварительный просмотр отображается в элементе управления изображением.

Эта процедура работает нормально в первый раз, однако, если изображение меняется (загружается новое) при следующем просмотре страницы, оно показывает ранее загруженное изображение. Я отладил приложение и все работает правильно. Новые данные изображения находятся в базе данных, а новый предварительный просмотр хранится в папке Temp, однако на странице отображается предыдущая. Если я обновлю страницу, она показывает предварительный просмотр нового изображения. Следует отметить, что предварительный просмотр всегда сохраняется на диск с одним именем (идентификатор каждой записи в качестве имени).

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

Спасибо и благодарность заранее,

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Самый простой способ - заставить ваше приложение изменять имя файла изображения при каждой загрузке нового изображения.

Возможно, добавив дату или дату и время к концу имени файла изображения.

Или вы можете попробовать установить элемент управления кэшем в заголовке HTML: <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

0 голосов
/ 20 мая 2010

Спецификация HTTP содержит различные заголовки, используемые для передачи клиентам информации о «кэшируемости» ресурсов. В Википедии также есть хорошее резюме здесь .

По сути, когда сервер передает клиенту некоторый ресурс, он поставляется с различными метаданными. На основе этих метаданных клиент решает, следует ли кэшировать ресурс, и если да, то как долго.

Вы можете решить свою проблему различными способами. Самый простой способ - просто установить заголовок Expires в ответе изображения на значение 1 января 1970 г. ( Unix Epoch ). Это сообщит клиенту об истечении срока действия записи в кэше в 1970 году. Поскольку он уже прошел 1970 год, клиент никогда не будет кэшировать ресурс и всегда будет запрашивать новую копию.

У этого подхода есть свои недостатки, а именно то, что вам не нужно излишне увеличивать пропускную способность и загружать сервер, если изображение никогда не меняется. Вот где появляются заголовки ETag и LastModified.

Сервер может рассчитать короткий хеш для каждого ресурса. Допустим, хэш одного изображения работает до a423fedc. Клиент сохранит этот хэш и при повторном запросе ресурса предоставит его на сервер, используя заголовок запроса If-None-Match. Если сервер рассчитывает, что ETag для этого ресурса не изменился, он просто отправит обратно 304 Not Modified, и клиент может использовать кэшированную версию. ETags объясняются далее здесь .

Но я думаю, что лучшим решением в вашем случае является заголовок Last-Modified. Сервер отправит дату, соответствующую времени последнего изменения изображения. После перезагрузки страницы клиент отправляет обратно эту же дату как часть заголовка If-Modified-Since. Если изображение было изменено с этой даты, сервер отправляет обновленное изображение. Если нет, он отправляет обратно код 304 Not Modified.

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

Для отладки рекомендуется протестировать браузер, такой как Firefox, с помощью плагина Firebug . Он может показать вам заголовки ваших запросов и ответов, чтобы вы знали, что на самом деле происходит по проводам. Если вы используете кэшированную версию или если сервер не возвращает новые данные, вы фактически увидите ответ 304 в Firebug, который может быть полезен.

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