我们有一个应用程序严重依赖于扩展 .NET System.Web.Hosting.VirtualPathProvider 架构的虚拟文件系统。我们使用链式搜索... (A)contentresourceprovider(扩展 virtualpathprovider) (B)assemblyresourceprovider (同上) (C)物理文件系统
vpp 像这样在应用程序初始化时注册...
HostingEnvironment.RegisterVirtualPathProvider(new AssemblyResourceProvider());
HostingEnvironment.RegisterVirtualPathProvider(new ContentResourceProvider());
这个问题与 ContentResourceProvider 相关(见下文)
public class ContentResourceProvider : System.Web.Hosting.VirtualPathProvider
{
#region Methods
public override bool FileExists(string virtualPath)
{
var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? ((ContentResourceVirtualFile)this.GetFile(virtualPath)).Exists : Previous.FileExists(virtualPath);
return result;
}
public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
{
var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceCacheDependency(virtualPath) : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
return result;
}
public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
{
var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceVirtualFile(virtualPath) : Previous.GetFile(virtualPath);
return result;
}
public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
{
var result = base.GetFileHash(virtualPath, virtualPathDependencies);
return result;
}
public static bool IsContentResourcePath(string virtualPath)
{
var pattern = @"~?/\(ContentManagementResource\)";
var result = Regex.IsMatch(virtualPath, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
return result;
}
#endregion Methods
}
基本上这一切都很好,每当我们通过我们的 cms 工具更新内容时,虚拟文件并从缓存中删除并重新打开/编译为剃刀视图。到目前为止一切都很好......但是我们最近将它部署到了一个服务器场,并且似乎整个固有的 System.Web.Hosting 虚拟文件提供程序无法扩展(显然)它与存储虚拟文件的特定服务器有关这意味着如果用户 A 通过 cms 工具对剃刀视图进行更改并且在服务器 A 上执行该操作,则用户 B 在服务器 B 上进行另一项更改将提供不希望的结果,尽管事实上内容来自同一个数据库。这是因为缓存剃刀视图的虚拟文件系统对于它们运行的 Web 服务器是唯一的,
我尝试过使用分布式缓存包,如 AppFabric、Memcached、NCache。这些还不够,因为它们依赖于您手动编写将序列化对象插入分布式缓存的代码。首先,.NET vpp 内存的东西在引擎盖下得到了有效的管理,并强制执行了严格的设计模式,而且 CacheDependency 类也不是可序列化的。
经过数小时的研究,我无法在网上找到解决方案。
当然,整个 .NET MVC 4.0 VirtualPathProvider/CacheDependency 系统架构必须有一种跨多台服务器扩展的方法?
我想根据我对此事的理解,我想问是否有办法在多个服务器上扩展 System.Web.Hosting 缓存内存,以便附加到这些文件的虚拟内容和缓存依赖项按预期工作?
任何帮助将不胜感激。