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

标签 asp.net caching virtualpathprovider

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

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

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

这是我所做的:

  • GetFile(path).Open()返回 FileStream通过 File.Open()
  • 我做了不是 覆盖 GetCacheKeyGetCacheDependencies
  • 我确实覆盖了 GetFileHash返回 Murmur 哈希(似乎是最快的,甚至比 CRC-32)并测试它
  • 调试时,GetFileHash在我的提供程序中从未调用过
  • CTRL-F5 ing 仅返回以下 header (不引用缓存)
    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 的调试服务器和配备 Firebug 的 Firefox 中进行调试。

    例如,这是我所期望的(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
    

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

    最佳答案

    为了缓存数据,我通常以这种方式使用 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。

    我希望这是有帮助的

    关于asp.net - 缓存通过 VirtualPathProvider 返回的静态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14086155/

    相关文章:

    javascript - 将变量从 ASP.net 传递到 JavaScript

    asp.net - 无法将数据插入到asp.net数据库中?

    mysql - sql缓存的缺点?

    java - EhCache Hibernate 二级缓存 maxBytesLocalHeap 慢

    java - 如何在Spring Java应用程序中缓存图像文件?

    asp.net-mvc - 配置 IIS 7 通过虚拟路径提供程序处理静态文件

    asp.net - 使用 VirtualPathProvider 从 DLL 加载 ASP.NET MVC View

    c# - 运行 JavaScript setInterval 的网站在 ~1 天后开始失败

    c# - 为什么 WPF BitmapImage 对象不从 ASP.Net Web 窗体中的 Uri 源下载图像?

    asp.net - 仅针对图像覆盖 ASP.NET 波形符 (~) 分辨率