Кэширование статических ресурсов, возвращаемых через 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.

В качестве примера вот что я ожидал (http://i.stack.imgur.com/3mn3d.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

Вопрос очевиден: как заставить браузер не перезагружать эти статические ресурсы?


person usr-local-ΕΨΗΕΛΩΝ    schedule 29.12.2012    source источник
comment
Не могли бы вы объяснить свое решение проблемы с кэшированием?   -  person Cristian E.    schedule 09.02.2015


Ответы (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.

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

person makemoney2010    schedule 08.04.2014