1

我们有一个应用程序严重依赖于扩展 .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 缓存内存,以便附加到这些文件的虚拟内容和缓存依赖项按预期工作?

任何帮助将不胜感激。

4

0 回答 0