Asp.net 缓存通过VirtualPathProvider返回的静态资源

Asp.net 缓存通过VirtualPathProvider返回的静态资源,asp.net,caching,virtualpathprovider,Asp.net,Caching,Virtualpathprovider,我正在使用一个VirtualPathProvider,它当前将虚拟路径映射到解决方案外部的目录。我建造这个主要是为了自我锻炼。这完全等同于在解决方案的目录中具有软链接或NTFS硬链接 无论如何,我使用自定义提供程序成功地从该虚拟目录加载静态图像 现在的问题是浏览器不会缓存图像。服务器甚至不考虑返回缓存信息(如ETag) 以下是我所做的: GetFile(path).Open()通过File.Open()返回FileStream 我没有覆盖GetCacheKey和GetCacheDependen

我正在使用一个
VirtualPathProvider
,它当前将虚拟路径映射到解决方案外部的目录。我建造这个主要是为了自我锻炼。这完全等同于在解决方案的目录中具有软链接或NTFS硬链接

无论如何,我使用自定义提供程序成功地从该虚拟目录加载静态图像

现在的问题是浏览器不会缓存图像。服务器甚至不考虑返回缓存信息(如ETag)

以下是我所做的:

  • GetFile(path).Open()
    通过
    File.Open()返回
    FileStream
  • 我没有覆盖
    GetCacheKey
    GetCacheDependencies
  • 我确实重写了返回杂音散列的
    GetFileHash
    (似乎是最快的,甚至比CRC-32还要快),并对其进行了测试
  • 调试时,
    GetFileHash
    从未在我的提供程序中调用
CTRL-F5
ing只返回以下标题(不引用缓存)

我目前正在VisualStudio的调试服务器和配备Firebug的Firefox中进行调试

举个例子,下面是我所期望的(http://i.stack.imgur.com/3mn3d.png)


问题很明显:我如何让浏览器而不是重新加载这些静态资源?

为了缓存数据,我通常使用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>

使用相同的技术,你可以在firebug或chrome中查看

我唯一从未优化过的是ETag


我希望这是有帮助的

您能解释一下您对缓存问题的解决方案吗?
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
<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>