Caching 在web场场景中使用.NET MVC 4.0 VirtualPathProviders

Caching 在web场场景中使用.NET MVC 4.0 VirtualPathProviders,caching,distributed,mv,virtualpathprovider,cache-dependency,Caching,Distributed,Mv,Virtualpathprovider,Cache Dependency,我们的应用程序严重依赖于扩展.NET system.Web.Hosting.VirtualPathProvider体系结构的虚拟文件系统。 我们使用链接来搜索。。。 (A) contentresourceprovider(扩展virtualpathprovider) (B) assemblyresourceprovider(同上) (C) 物理文件系统 vpp在应用程序初始化时注册,如下所示 HostingEnvironment.RegisterVirtualPathProvider(new A

我们的应用程序严重依赖于扩展.NET system.Web.Hosting.VirtualPathProvider体系结构的虚拟文件系统。 我们使用链接来搜索。。。 (A) contentresourceprovider(扩展virtualpathprovider) (B) assemblyresourceprovider(同上) (C) 物理文件系统

vpp在应用程序初始化时注册,如下所示

HostingEnvironment.RegisterVirtualPathProvider(new AssemblyResourceProvider());
HostingEnvironment.RegisterVirtualPathProvider(new ContentResourceProvider());
此问题与ContentResourceProvider有关(请参见下文)

基本上这一切都很好,每当我们通过cms工具更新内容时,虚拟文件就会从缓存中删除并重新打开/编译到razor视图中。 到目前为止一切都很好。。。。 然而,我们最近将其部署到了一个服务器场,似乎整个固有的System.Web.Hosting虚拟文件提供程序thingy没有扩展(显然)它是相对于在内存中存储虚拟文件的特定服务器等。 这意味着,如果用户A通过cms工具更改razor视图,并且该操作在服务器A上执行,那么用户B在服务器B上进行另一次更改将提供不需要的结果,尽管内容来自同一数据库。这是因为缓存razor视图的虚拟文件系统对于运行它们的web服务器是唯一的,同样,CacheDependencies仅在相对服务器上触发

我尝试过使用分布式缓存包,如AppFabric、Memcached和NCache。这是不够的,因为它们依赖于您手动编写将序列化对象插入分布式缓存的代码。首先,通过强制实施严格的设计模式,可以有效地管理.NET vpp内存,而且CacheDependency类不可序列化

经过数小时的研究,我无法在网上找到解决方案

当然,整个.NETMVC4.0VirtualPathProvider/CacheDependency系统体系结构必须能够跨多个服务器进行扩展

从我对这件事的理解来看,我想问的是,是否有一种方法可以跨多台服务器扩展System.Web.Hosting缓存内存,从而使附加到这些文件的虚拟内容和缓存依赖项按预期工作

任何帮助都将不胜感激

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 
}