【问题标题】:Virtual Path Provider disable caching?虚拟路径提供程序禁用缓存?
【发布时间】:2010-12-03 02:34:01
【问题描述】:

我有一个虚拟路径提供程序。问题是它缓存我的文件。每当我手动编辑它引用的其中一个 aspx 文件时,VPP 不会拉入新文件,它会继续重用旧文件,直到我重新启动站点。

我什至在我的 VirtualPathProvider 类中超越了 GetCacheDependency():

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        return null;
    }

想法?

【问题讨论】:

    标签: c# caching virtualpathprovider


    【解决方案1】:

    返回 null 本质上是告诉 ASP.NET 您没有任何依赖项 - 因此 ASP.NET 不会重新加载该项目。

    你需要的是返回一个有效的依赖,例如

     public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            return new CacheDependency(getPhysicalFileName(virtualPath));
        }
    

    更正确的方法是确保您只处理自己的缓存依赖项(这是一个示意图示例):

     public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            if (isMyVirtualPath(virtualPath))
                return new CacheDependency(getPhysicalFileName(virtualPath));
            else
                return new Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
    

    【讨论】:

      【解决方案2】:

      禁用缓存的正确方法是:

          public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
          {
              if (_IsLayoutFile(virtualPath))
              {
                  return null;
              }
              return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
          }
      
          public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies)
          {
              if (_IsLayoutFile(virtualPath))
              {
                  return Guid.NewGuid().ToString();
              }
      
              return Previous.GetFileHash(virtualPath, virtualPathDependencies);
          }
      

      【讨论】:

      • 基于假设,返回空缓存依赖将强制 VPP 使用 getfilehash ?
      • 我想通了,这是真的:返回 null CacheDependecy 将强制 VPP 使用 GetFileHash。
      【解决方案3】:

      我不相信这是原始发帖人所要求的。他想完全禁用缓存,而不是以更好的方式实现它,尽管您的帖子对后者有帮助。

      很多人都在使用 VirtualPathProvider 从数据库而不是文件系统中提取数据。我看不出创建文件系统依赖项如何成为确定何时刷新文件的有用方法。

      您将如何强制它从不使用缓存并始终检索文件的最新版本?这就是问题。

      【讨论】:

      【解决方案4】:
      public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
      {
         return IsVirtualPath(virtualPath) ? new CacheDependency(HttpContext.Current.Server.MapPath("~/Resource.xml")) 
                                           : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
      }
      

      【讨论】:

        【解决方案5】:

        根据需要对我有用的解决方案是:

        • GetCacheDependency:返回null;
        • GetFileHash: return Guid.NewGuid().ToString();

        但是,使用此解决方案会导致服务器挂起(Cassini、IIS 6、IIS 7、IIS 8)。挂起只持续几分钟,然后结果就出来了。

        我还对虚拟路径/文件进行了测试,结果相同。我搞砸了浏览器超时。

        谁能帮忙?

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        • 2015-12-21
        • 1970-01-01
        相关资源
        最近更新 更多