ImageResizer DiskCache+AzureReader странное поведение

Я использую ImageResizer + Diskcache Плагин, и я нахожу проблемы, чтобы заставить кеш работать правильно. Либо изображения кэшируются навсегда (независимо от того, сколько раз я загружаю новое изображение), либо изменяя некоторые настройки, я получаю старое изображение в некоторых браузерах / компьютерах и новое в других.

Вот что у меня сейчас есть в моем файле web.config:

<add name="AzureReader2" connectionString="blahblahblah" endpoint="http://blahblahblah.blob.core.windows.net/" prefix="~/" redirectToBlobIfUnmodified="false" requireImageExtension="false" checkForModifiedFiles="true" cacheMetadata="true"/>

а также:

    <diskcache dir="~/imagecache" autoclean="true" hashModifiedDate="true" subfolders="8192" asyncWrites="true" asyncBufferSize="10485760" cacheAccessTimeout="15000" logging="true" />

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

Я думал:

  • Возможно, наличие триггера для хранения больших двоичных объектов, который при загрузке замещающего изображения запускает веб-крючок, который удаляет кэш для этого изображения?
  • Или веб-запрос к моему приложению imageresizer, чтобы предварительно загрузить новое изображение в кэш, чтобы оно заменило старое кэшированное изображение???

Я видел несколько постов об использовании IVirtualFileWithModifiedDate, но насколько я понимаю, это сильно повлияет на производительность? Это, вероятно, 5% нашего запроса изображений, когда кто-то загрузит изображение и ожидает, что оно увидит его сразу, поскольку большинство изображений практически не меняются, но это действительно расстраивает, если изображение не показывает новое даже через день после того, как они загрузил его!

Если я могу использовать IVirtualFileWithModifiedDate сделать недействительным кеш, когда изображение изменилось и не в каждом запросе изображения? Это будет возможно?

1 ответ

Решение

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

То, что разные браузеры отображают разные версии, указывает на то, что кеширование в браузере или прокси /CDN является ошибкой.

DiskCache в ImageResizer хэширует дату изменения, поэтому она всегда так же корректна, как и поставщик хранилища.

Что касается ваших ожиданий в отношении аннулирования на стороне сервера:

Вы используете checkForModifiedFiles="true" cacheMetadata="true" Это означает, что в Azure запрашивается последняя измененная дата, но метаданные кэшируются с помощью скользящего окна истечения срока действия 1 час. То есть, если URL не был доступен в течение 1 часа, следующий запрос приведет к проверке измененной даты. См. StandardMetadataCache.

Вы можете изменить это поведение, внедрив IMetadataCache самостоятельно и назначив этот кеш члену.MetadataCache поставщика хранилища, который вы используете.

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