虚拟路径提供程序禁用缓存?

时间:2009-10-01 18:43:31

标签: c# caching virtualpathprovider

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

我甚至在我的VirtualPathProvider类中过度使用了GetCacheDependency():

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

想法?

5 个答案:

答案 0 :(得分:20)

返回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);
    }

答案 1 :(得分:16)

禁用缓存的正确方法是:

    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);
    }

答案 2 :(得分:2)

我不相信这是原始海报所要求的。他希望完全禁用缓存,而不是以更好的方式实现缓存,尽管你的帖子对后者很有帮助。

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

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

答案 3 :(得分:1)

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);
}

答案 4 :(得分:-1)

根据需要为我工作的解决方案是:

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

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

我还包含了一个具有相同结果的虚拟路径/文件测试。我搞砸浏览器超时。

有人可以帮忙吗?