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

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

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

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

想法?

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

禁用缓存的正确方法是:

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

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

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

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

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

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

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

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

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

有人可以帮忙吗?

Interesting Posts