8

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

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

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

想法?

4

5 回答 5

21

返回 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);
    }
于 2009-11-17T21:21:14.630 回答
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);
    }
于 2013-06-04T17:48:34.853 回答
2

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

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

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

于 2013-04-25T18:19:39.007 回答
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);
}
于 2013-04-04T11:45:36.027 回答
-1

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

  • GetCacheDependency:返回空值;
  • GetFileHash:返回 Guid.NewGuid().ToString();

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

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

任何人都可以帮忙吗?

于 2017-07-25T22:53:17.967 回答