Кэширование статических ресурсов, возвращаемых через VirtualPathProvider
Я использую VirtualPathProvider
который в настоящее время сопоставляет виртуальный путь с каталогом, внешним по отношению к решению. Я строю это в основном для самостоятельных упражнений. Это полностью эквивалентно наличию мягкой ссылки или жесткой ссылки NTFS в каталоге решения.
Во всяком случае, мне удалось успешно загрузить статические изображения из этого виртуального каталога, используя мой пользовательский поставщик.
Теперь проблема в том, что браузер не будет кэшировать изображения. И сервер даже не думает о возврате информации из кеша (например, ETag).
Вот что я сделал:
GetFile(path).Open()
возвращаетсяFileStream
с помощьюFile.Open()
- Я не переопределил
GetCacheKey
а такжеGetCacheDependencies
- Я переопределил
GetFileHash
возвращает хэш Murmur (кажется, самый быстрый, даже чем CRC-32) и проверяет его - Во время отладки,
GetFileHash
никогда не вызывается в моем провайдере
CTRL-F5
ing возвращает только следующие заголовки (без ссылки на кеш)
Cache-Control private
Content-Length 476
Content-Type image/png
Date Sat, 29 Dec 2012 21:25:54 GMT
Server Microsoft-IIS/8.0
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles [...]
В настоящее время я отлаживаю в отладочном сервере Visual Studio и Firefox, оснащенном Firebug.
В качестве примера, вот что я ожидал (https://stackru.com/images/1223b3a54e6f64e428aa58512d1725f84b441c74.png)
Accept-Ranges bytes
Cache-Control max-age=315360000
Content-Length 1059
Content-Type image/png
Date Sat, 29 Dec 2012 21:35:29 GMT
Etag "7d636a8ef932ed081c16ace6f87b16e6"
Expires Fri, 12 Feb 2038 09:58:39 GMT
Last-Modified Tue, 14 Feb 2012 22:07:18 GMT
Server ECAcc (fcn/4089)
X-Cache HIT
Вопрос очевиден: как заставить браузер не перезагружать эти статические ресурсы?
1 ответ
Для кеширования данных я обычно использую webconfig таким образом, который очень прост по моему личному совету:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="180.00:00:00" />
</staticContent>
<caching>
<profiles>
<add extension=".ico" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".html" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".htm" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".pdf" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".bmp" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".jpeg" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".png" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".gif" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".js" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".css" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".jpg" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
</profiles>
</caching>
</system.webServer>
И я решил все свои проблемы.
Вы можете посмотреть здесь http://italiancallcenter.com/ которые используют ту же технику или http://annunciando.biz/ и вы можете проверить в конце концов в firebug или chrome....
Единственное, что я никогда не оптимизировал, это etags.
Я надеюсь, что это полезно