Кэширование статических ресурсов, возвращаемых через VirtualPathProvider

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

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

Теперь проблема в том, что браузер не будет кэшировать изображения. И сервер даже не думает о возврате информации из кеша (например, ETag).

Вот что я сделал:

  • GetFile(path).Open() возвращается FileStream с помощью File.Open()
  • Я не переопределил GetCacheKey а также GetCacheDependencies
  • Я переопределил GetFileHash возвращает хэш Murmur (кажется, самый быстрый, даже чем CRC-32) и проверяет его
  • Во время отладки, GetFileHash никогда не вызывается в моем провайдере

CTRL-F5ing возвращает только следующие заголовки (без ссылки на кеш)

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.

Я надеюсь, что это полезно

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